Группировать результаты из веб-разбивки на разделы

Оператор == проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals() проверьте фактическое содержимое строки (значение).

Обратите внимание, что метод .equals() принадлежит классу Object (суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.

  • Случай 1
    String s1 = "Stack Overflow";
    String s2 = "Stack Overflow";
    s1 == s2;      //true
    s1.equals(s2); //true
    
    Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле.
  • Случай 2
    String s1 = new String("Stack Overflow");
    String s2 = new String("Stack Overflow");
    s1 == s2;      //false
    s1.equals(s2); //true
    
    Причина. Если вы создаете объект String с использованием ключевого слова new, ему выделяется отдельное пространство в куче.
1
задан Anthon 14 March 2019 в 07:21
поделиться

1 ответ

Один из подходов состоит в том, чтобы найти тег <strong> с соответствующим содержимым дня, а затем использовать .next_siblings для итерации вперед по продуктам, пока вы не нажмете другую <strong> или не исчерпаете братьев и сестер. Я использовал парсер lxml, но он работает и с html.parser.

Вот ваш пример DOM (я откорректировал продукты, чтобы было ясно, что он работает):

import bs4
import requests

day = "Tuesday"
dom = """
<div class="menu">
<strong>Monday</strong>
<br>
Food 1<br>
Food 2
<br><br>
<strong>Tuesday</strong>
<br>
Food 3<br>
Food 4
<br><br>
<strong>Wednesday</strong>
<br>
Food 5<br>
Food 6
<br><br>
<strong>Thursday</strong>
<br>
Food 7<br>
Food 8
<br><br>
<strong>Friday</strong>
<br>
Food 9<br>
Food 10
<br><br>
</div>
"""

soup = bs4.BeautifulSoup(dom, "lxml")
menu = soup.find(class_ = "menu")
foods = []

for elem in menu.find("strong", text=day).next_siblings:
    if elem.name == "strong": 
        break

    if isinstance(elem, bs4.element.NavigableString) and elem.strip() != "":
        foods.append(elem.strip())

print(foods)

Вывод:

['Food 3', 'Food 4']
<час>

Вот оно на первом прямом сайте https://www.kvartersmenyn.se/rest/15494 . Обратите внимание на расширенную кодировку символов и лямбду, чтобы сопоставление работало, если в теге <b> есть дополнительный контент:

# -*- coding: latin1 -*-

import bs4
import requests

day = "Måndag"
url = "https://www.kvartersmenyn.se/rest/15494"

soup = bs4.BeautifulSoup(requests.get(url).text, "lxml")
menu = soup.find(class_ = "meny")
foods = []

for elem in menu.find("b", text = lambda x: day in x).next_siblings:
    if elem.name == "b": 
        break

    if isinstance(elem, bs4.element.NavigableString):
        foods.append(elem)

print(day)

for food in foods:
    print(food)

Вывод:

Måndag
A: Gaeng phed**
röd curry i cocosmjölk med sötbasilika, wokade blandade grönsaker
B: Ghai phad med mauang** (biff) wok i chilipaste med cashewnötter, grönsaker
C: Phad bamme (fläsk) wokade äggnudlar i ostronsås, grönsaker
D: Satay gay currymarinerade kycklingfiléspett med jordnötssås
E: Gai chup pheng tood*
Friterad kyckling med söt chilisås och ris
F: Phad bambou* (biff) wok i ostronsås med bambu, lök, champinjoner

Наконец, вот он на вашем втором живом сайте, http://bramatno8.kvartersmenyn.se/ . Все эти сайты имеют различную и непоследовательную структуру, поэтому не очевидно, есть ли для них серебряная пуля. Я подозреваю, что эти меню написаны вручную кем-то, кто может не понимать структурирование документа, поэтому потребуется некоторая работа для обработки произвольных обновлений страницы.

Здесь идет:

# -*- coding: latin1 -*-

import bs4
import requests

day = "Måndag"
url = "http://bramatno8.kvartersmenyn.se/"

soup = bs4.BeautifulSoup(requests.get(url).text, "lxml")
menu = soup.find(class_ = "meny")
foods = []

for elem in menu.find(text = day).parent.next_siblings:
    if elem.name == "strong": 
        break

    if isinstance(elem, bs4.element.NavigableString):
        foods.append(elem)

print(day)

for food in foods:
    print(food)

Вывод:

Måndag
Viltskav med rårörda lingon (eko), vaxbönor och potatispuré
Sesambakad blomkål med sojamarinerade böngroddar, salladslök, rädisa och sojabönor samt ris
0
ответ дан ggorlen 14 March 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: