Оператор ==
проверяет, указывают ли две ссылки на один и тот же объект или нет. .equals()
проверьте фактическое содержимое строки (значение).
Обратите внимание, что метод .equals()
принадлежит классу Object
(суперкласс всех классов). Вам необходимо переопределить его в соответствии с вашим требованием к классу, но для String оно уже реализовано и проверяет, имеет ли две строки одно и то же значение.
String s1 = "Stack Overflow";
String s2 = "Stack Overflow";
s1 == s2; //true
s1.equals(s2); //true
Причина: строка литералы, созданные без нуля, хранятся в пуле строк в области перментонов кучи. Таким образом, оба s1 и s2 указывают на один и тот же объект в пуле. String s1 = new String("Stack Overflow");
String s2 = new String("Stack Overflow");
s1 == s2; //false
s1.equals(s2); //true
Причина. Если вы создаете объект String с использованием ключевого слова new
, ему выделяется отдельное пространство в куче. Один из подходов состоит в том, чтобы найти тег <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