【问题标题】:python beautifulsoup find between tagspython beautifulsoup在标签之间查找
【发布时间】:2023-04-04 20:26:01
【问题描述】:

我正在尝试从网站获取数据。我设法获得了我想要的数据子集

sections = rows.findAll('p')
for section in sections
    print section

这给了我这个:

<p><i>Hello<strong>World</strong></i></p>
<p><strong>Some Text</strong><p>
<p></p>
<p><strong>Monday</strong><p>
<p>section1</p>
<p>section2</p>
<p>section3</p>
<p><strong>Tuesday</strong><p>
<p>section1</p>
<p>section2</p>
<p>section3</p>
<p>section4</p>
<p></p>

我想要的是这个:

Monday
section1
section2
section3
Tuesday
section1
section2
section3
section4 

如果 strong 等于我拥有的 dict,我可以获取strong 标签之间的所有 p 标签吗?或者应该怎么解决?

【问题讨论】:

  • 原始 HTML 是什么?这些&lt;p&gt; 在HTML 中的什么位置?也许它们位于一些独特的标签中,您可以使用它来过滤结果 - 即find("some tag", "attributes").find_all("p")
  • 也许切片结果rows.findAll('p')[3:-1]
  • 原来的html很乱但是所有p标签都在一个div里coderows=soup.find('div', attrs={'class': 'box-default top-border '})
  • 你不能显示这个页面的网址吗?
  • 当然。这是页面。它是瑞典语,在我的例子中我试图简化它westmanska.se/dagens-lunch

标签: python beautifulsoup scrape


【解决方案1】:

只需使用正则表达式模块,然后用下面的代码 sn-p 替换 for 循环。它会做的工作

import re
# your code
for section in sections 
    match=re.match(r'^(?:\s*<[^>]*?>\s*)*?([^<>]+?)(?:\s*<[^>]*?>\s*)*?$',section)
    if(match):
        print(match.group(1))

如果您想知道正则表达式匹配的内容:

^(?:\s*]?>\s)*?: 将从字符串开头匹配多个标签

([^]+?): 将开始和结束标签之间的单词分组

(?:\s*]?>\s)*?$: 将匹配多个标签直到字符串结尾

【讨论】:

  • 问题是它可以是 p 标签中的任何内容。我只是以第 1 节、第 2 节等为例,我猜这不是最好的
  • @Ruud 你应该展示你拥有的真实 HTML,然后我们可以尝试为这个真实的 HTML 创建代码。现在我们只能使用您所显示的 HTML,因为我们不知道您的 HTML 有多复杂。
  • 顺便说一句:在下面的评论中问题 OP 将 url 添加到原始 HTML:westmanska.se/dagens-lunch
【解决方案2】:

似乎在https://westmanska.se/dagens-lunch/ 中,您需要Vecka 10 之后的所有&lt;p&gt;,它位于&lt;h1&gt; 中,它是唯一的标签,您可以尝试使用它来过滤数据。

soup.find('h1').find_next_siblings('p'):

import requests
from bs4 import BeautifulSoup

url = 'https://westmanska.se/dagens-lunch/'
r = requests.get(url)
soup = BeautifulSoup(r.text, 'html.parser')

for row in soup.find('h1').find_next_siblings('p'):
    print(row.text)

结果:

Måndag
Currystekt kycklingfilé med mangosås & grönsaksris (GF/LF)
Rödbetsgravad lax med stuvade gulbetor & potatis serveras med gröna ärtor & citron (GF/LF)
Falafel med tahinisås, grönsaksris & saltgurka (GF)
Capresesoppa med soltorkade tomater, oregano, basilika & mozzarella (LF/Vegan utan ost)
Pasta bolognese med rökt sidfläsk & champinjoner toppas med parmesanost samt ruccola (LF)
Tisdag
Raggmunk med stekt fläsk & rårörda lingon (GF/LF)
Posherad torskrygg med gräslökssås, kokt potatis, pepparrot & bacon (GF/LF)
Kikärtsplättar med rostade nötter, friterad chevré, färsk fikon & saffranshonung
Capresesoppa med soltorkade tomater, oregano, basilika & mozzarella (LF/Vegan utan ost)
Pasta bolognese med rökt sidfläsk & champinjoner toppas med parmesanost samt ruccola (LF)
Onsdag
Pannbiff med grönpepparsås, potatismos & rårörda lingon
Ugnsbakad koljafilé med äggsås, dillslungad potatis & riven morot (GF/LF)
Majsplättar med avokado-chimmichurri & kokt potatis(GF/Vegan)
Capresesoppa med soltorkade tomater, oregano, basilika & mozzarella (LF/Vegan utan ost)
Pasta bolognese med rökt sidfläsk & champinjoner toppas med parmesanost samt ruccola (LF)
 
Torsdag (Stängt fullbokat)
 
Fredag 
Örtmarinerad flankstek med rödvinsås, potatisgratäng & ångad broccoli (GF/LF)
Panerad flundra med curryremoulad, kokt potatis, gröna ärtor & citron (LF)
Bakad sötpotatis med avokado/fetaoströra toppas med picklad rödlök & lime (GF)
Capresesoppa med soltorkade tomater, oregano, basilika & mozzarella (LF/Vegan utan ost)
Pasta bolognese med rökt sidfläsk & champinjoner toppas med parmesanost samt ruccola (LF)
 

【讨论】:

    【解决方案3】:

    您可以使用 dict 来保存数据并检查要保存的内容。当前组总是保存在current_group,简单的逻辑:

    needed_sections_dict = {'Monday': [], 'Tuesday': []}
    current_group = None
    
    sections = rows.findAll('p')
    for section in sections
        # check if current p contains strong group heading
        # change current_group and continue if it found
        group = section.find('strong')
        if group and group.text:
            if group.text in needed_sections_dict:
                current_group = group.text
            else:
                # not needed group
                current_group = None
            continue
    
        # current section is not <strong>
        # so we check that it contains something and add it to
        # current group dict list if current_group is not None (needed)
        if current_group and section.text.strip():
            needed_sections_dict[current_group].append(section.text)
    

    测试:

    >>> needed_sections_dict
    {'Monday': ['section1', 'section2', 'section3'],
     'Tuesday': ['section1', 'section2', 'section3', 'section4']}
    

    【讨论】:

    【解决方案4】:

    请看看这个。

    from bs4 import BeautifulSoup
    import requests
    
    data = requests.post('https://westmanska.se/dagens-lunch/')
    
    soup = BeautifulSoup(data.text, features="html5lib")
    status = False
    for div_tag in soup.find_all('div', class_="box-default top-border"):
        if div_tag.find_next('h5'):
            for p_tag in div_tag.find_all('p'):
                if not p_tag.find_next('i') or not p_tag.find_next('br'):
                        print(p_tag.text)
    
    

    【讨论】:

    • 您的代码给出了 HelloWorldSome Text 但 OP 不想要它。
    • 更改 for 循环 for p_tag in soup.find_all('p')[2:]: @furas
    • 您可以将其添加到答案中。但是在其他 cmets 中,您可以读到 OP 具​​有更复杂的 HTML(但 OP 没有显示它),它可能需要更复杂的解决方案 :)
    • 顺便说一句:在下面的评论中问题 OP 将 url 添加到原始 HTML:westmanska.se/dagens-lunch
    • @furas 我已经根据网站用例更新了代码。
    猜你喜欢
    • 2019-10-31
    • 1970-01-01
    • 2013-09-18
    • 1970-01-01
    • 2012-11-04
    • 2020-12-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多