python красивая находка между тегами - PullRequest
1 голос
/ 05 марта 2020

Я пытаюсь получить данные с веб-сайта. Мне удалось получить подмножество данных, которые я хочу

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 

Может Я получаю все p-теги между сильными тегами, если strong равен dict, который у меня есть? Или как мне это решить?

Ответы [ 4 ]

0 голосов
/ 05 марта 2020

Кажется, в https://westmanska.se/dagens-lunch/ вам нужно все <p> после Vecka 10, что в <h1>, и это уникальный тег, который вы можете использовать для фильтрации данных.

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)
 
0 голосов
/ 05 марта 2020

Пожалуйста, проверьте это.

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)

0 голосов
/ 05 марта 2020

Вы можете использовать dict для сохранения ваших данных и проверки того, что сохранить. Текущая группа всегда сохраняется в current_group, простой лог c:

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']}
0 голосов
/ 05 марта 2020

Просто используйте модуль регулярных выражений, а затем замените для l oop приведенный ниже фрагмент кода. Он будет работать

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 ) *? $: будет соответствовать нескольким тегам до конца строки

...