python beautifulsoup在标记之间查找

python beautifulsoup在标记之间查找,python,beautifulsoup,scrape,Python,Beautifulsoup,Scrape,我试图从一个网站上获取数据。我设法得到了我想要的数据的一个子集 sections = rows.findAll('p') for section in sections print section 这就给了我: <p><i>Hello<strong>World</strong></i></p> <p><strong>Some Text</strong><p> <

我试图从一个网站上获取数据。我设法得到了我想要的数据的一个子集

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>

如果strong等于我的dict,我能得到强标记之间的所有p标记吗?或者我应该如何解决它?

只需使用regex模块,然后用下面的代码片段替换for循环。它会成功的

import re
# your code
for section in sections 
    match=re.match(r'^(?:\s*<[^>]*?>\s*)*?([^<>]+?)(?:\s*<[^>]*?>\s*)*?$',section)
    if(match):
        print(match.group(1))
重新导入
#你的代码
一节接一节
match=re.match(r'^(?:\s*]*?>\s*)*?([^]+?)(?:\s*]*?>\s*)*?$,节)
如果(匹配):
打印(匹配组(1))
如果您想知道正则表达式与什么匹配:

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

([^]+?): 将单词分组在起始标记和结束标记之间

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

只需使用regex模块,然后用下面的代码段替换for循环。它会成功的

import re
# your code
for section in sections 
    match=re.match(r'^(?:\s*<[^>]*?>\s*)*?([^<>]+?)(?:\s*<[^>]*?>\s*)*?$',section)
    if(match):
        print(match.group(1))
重新导入
#你的代码
一节接一节
match=re.match(r'^(?:\s*]*?>\s*)*?([^]+?)(?:\s*]*?>\s*)*?$,节)
如果(匹配):
打印(匹配组(1))
如果您想知道正则表达式与什么匹配:

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

([^]+?): 将单词分组在起始标记和结束标记之间

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

请检查此项

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)

请看看这个

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)


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

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)

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

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)
中的
Vecka 10
之后,您似乎需要所有
,它是唯一的标记,您可以尝试使用它来过滤数据

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

结果:

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)
 
中的
Vecka 10
之后,您似乎需要所有
,它是唯一的标记,您可以尝试使用它来过滤数据

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

结果:

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)
 


什么是原始HTML?在HTML中的什么地方有这些
?也许它们是在一些独特的标签中,你可以用它来过滤结果-例如
find(“一些标签”,“属性”)。find_all(“p”)
Maybe slice results
rows.findAll('p')[3:-1]
原始html是一团乱麻,但是所有的p标签都位于div
code
rows=soup.find('div',attrs={'class':'box default top border'))你不能显示这个页面的url吗?当然。这是页面。它是用瑞典语写的,在我的例子中,我试图简化它,什么是原始的HTML?在HTML中的什么地方有这些
?也许它们是在一些独特的标签中,你可以用它来过滤结果-例如
find(“一些标签”,“属性”)。find_all(“p”)
Maybe slice results
rows.findAll('p')[3:-1]
原始html是一团乱麻,但是所有的p标签都位于div
code
rows=soup.find('div',attrs={'class':'box default top border'))你不能显示这个页面的url吗?当然。这是页面。在我的例子中,我试图简化它,问题是它可以是p标签中的任何东西。我只是以第1节、第2节等为例,这并不是我最好的选择guess@Ruud您应该显示您拥有的真正的HTML,然后我们可以尝试为这个真正的HTML创建代码。现在,我们只能处理您正在讨论的HTML,因为我们不知道您的HTML有多复杂。顺便说一句:在下面的评论中,问题OP将url添加到原始HTML中:问题是它可以是p标记中的任何内容。我只是以第1节、第2节等为例,这并不是我最好的选择guess@Ruud您应该显示您拥有的真正的HTML,然后我们可以尝试为这个真正的HTML创建代码。现在,我们只能处理您正在讨论的HTML,因为我们不知道您的HTML有多复杂。顺便说一句:在下面的评论中,问题OP将url添加到原始HTML中:您的代码提供了
HelloWorld
一些文本,但OP不想要它。更改为soup中p_标记的循环。find_all('p')[2:]:@furasy您可以将其添加到答案中。但在其他评论中,您可以看到OP有更复杂的HTML(但OP没有显示)而且它可能需要更复杂的解决方案:)顺便说一句:在下面的评论中,问题OP在原始HTML中添加了url:@furas我已经根据网站用例更新了代码。您的代码给出了
HelloWorld
一些文本,但OP不想要它。更改为soup中p_标记的循环。find_all('p')[2::@furasy您可以在答案中添加它。但在其他评论中,您可以看到OP有更复杂的HTML(但OP没有显示)它可能需要更复杂的解决方案:)顺便说一句:在下面的评论中,问题OP将url添加到原始HTML:@furas我已经根据网站用例更新了代码。顺便说一句:在下面的评论中,问题OP将url添加到原始HTML中:顺便说一句:在下面的评论中,问题OP将url添加到原始HTML中: