如何使用<li>美丽汤提取 <ul 类 =...> 下的值



前言:出于好奇,我正在一个房地产网站上进行网页抓取。作为python的新手,我一直在修改其他共享代码中的代码,以此作为学习的一种方式。我偶然发现了一个新的挑战,我从未学会如何在任何地方做到这一点。因此,我想向社区寻求帮助。

我想要什么:我想提取值";4〃;以及";3〃;在CCD_ 1元素下作为单独的项目。请参阅我附在这篇文章中的图片,以获取网站元素的摘录。

我尝试的:我看到它们列在div class="列表卡标题";所以我在下面的代码中为名为"bed_bath"的属性尝试了card.find("div", {"class":"list-card-heading"}).find("ul").find("li"))。但我只得到了嵌入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>

请帮助

图片:网站的元素

您需要使用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"))]

要从HTML片段中获取["3", "4"],可以执行以下操作:

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')]

最新更新