#python #web-scraping #beautifulsoup #append
#python #очистка веб-страниц #beautifulsoup #добавить
Вопрос:
Предисловие: я из любопытства просматриваю веб-страницы на веб-сайте недвижимости. Будучи полным новичком в python, я модифицировал коды из других общих кодов, чтобы научиться. Я наткнулся на новую проблему, которую я никогда нигде не изучал, как это сделать. Итак, я хотел бы попросить сообщество о помощи.
Что я хочу: я хотел бы извлечь значения «4» и «3» из <li>
элементов как отдельные элементы. Пожалуйста, посмотрите изображение, которое я прикрепил к этому сообщению, для извлечения элементов с веб-сайта.
Что я попытался: я вижу, что они перечислены в div class=»list-card-heading», поэтому я попробовал card.find("div", {"class":"list-card-heading"}).find("ul").find("li"))
в приведенном ниже коде для атрибута с именем ‘bed_bath’. Но я получил только первое значение, встроенное в HTML…
content = BeautifulSoup(response,"lxml")
deck = content.find('ul',{'class':'photo-cards photo-cards_wow photo-cards_short'})
for card in deck.contents:
script = card.find('script',{'type': 'application/ld json'})
if script:
script_json = json.loads(script.contents[0])
self.results.append({
'latitude': script_json['geo']['latitude'],
'longitude': script_json['geo']['longitude'],
'floorSize': script_json['floorSize']['value'],
'url': script_json['url'],
'price': card.find('div', {'class': 'list-card-price'}).text,
'bed_bath': (card.find("div", {"class":"list-card-heading"}).find("ul").find("li")),
'address': card.find('address', {'class':'list-card-addr'}).text
})
Результат моей попытки новичка: <li>3<abbr class="list-card-label"> <!-- -->bds</abbr></li>
Пожалуйста, помогите
Изображение: Элементы с веб-сайта
Ответ №1:
Вы захотите использовать комбинацию find_all
функции и text
атрибута.
elements = card.find("div", { "class": "list-card-heading" }).find("ul").find_all("li")) # get all <li> elements in the <el>
values = []
for element in elements:
values.append(element.text) # get the inner text from the <li> element
или, более кратко:
values = [element.text for element in card.find("div", { "class": "list-card-heading" }).find("ul").find_all("li"))]
Ответ №2:
Чтобы получить ["3", "4"]
из фрагмента HTML, вы можете сделать:
from bs4 import BeautifulSoup
txt = '''<ul class="list-card-details">
<li>
"4"
<abbr class="list-card-label">bds</abbr>
</li>
<li>
"3"
<abbr class="list-card-label">ba</abbr>
</li>
</ul>
'''
soup = BeautifulSoup(txt, 'html.parser')
out = [li.contents[0].strip() for li in soup.select('ul.list-card-details li')]
print(out)
С принтами:
['"4"', '"3"']
Или:
out = [li.find(text=True).strip() for li in soup.select('ul.list-card-details li')]
Или:
out = [li.get_text(strip=True, separator='|').split('|')[0] for li in soup.select('ul.list-card-details li')]