繁体   English   中英

python beautifulsoup 在标签之间查找

[英]python beautifulsoup find between tags

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

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 等于我拥有的字典,我可以在强标签之间获得所有 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 )*?$: 将匹配多个标签直到字符串结束

请检查这个。

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 来保存数据并检查要保存的内容。 当前组总是保存在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']}

https://westmanska.se/dagens-lunch/ 中,您需要在<h1> Vecka 10之后的所有<p>并且它是唯一的标签,您可以尝试使用它来过滤数据。

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)
 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM