通过搜索类属性查找列表中的元素数量时出现问题 - BeautifulSoup

Problem finding number of elements in a list by searching for class attribute - BeautifulSoup

提问人:DCUpro 提问时间:9/13/2023 更新时间:9/14/2023 访问量:32

问:

我正在尝试使用 Beautiful Soup 捕获列表中的元素数量,但我遇到了一个问题并返回了一个空数组。我很确定这曾经对我有用,但现在不再有用了。

我将感谢大师们的任何帮助或指导,因为我相信有更好的方法。我对此完全陌生,感到有点迷茫。

因此,如果我们采用如下所示的嵌套列表,其中包含 3 个元素:

<div class="row">
...
<div class="style_details">
<ul data-id="list" class="listing_details">
<li data-id="listing-index-1"></li>
<li data-id="listing-index-2"></li>
<li data-id="listing-index-3"></li>
</ul>
</div>

以及一段代码,用于使用属性“class=”listing_details“对列表元素进行计数

browser.get(url)
c = browser.page_source
soup = BeautifulSoup(c, "html.parser")
dom = etree.HTML(str(soup))  
data = soup.findAll('li',attrs={'class':'listing_details'})
links = len(data)

return links

嵌套在无序列表中的类是否导致了问题?任何想法如何克服这个问题或更好的方法来计算列表中的项目?

蟒蛇 HTML beautifulsoup

评论


答:

0赞 Jack Fleeting 9/13/2023 #1

您似乎同时使用 BS 和 lxml。无论哪种情况,您都应该计算 的子项数。<ul data-id="list" class="listing_details">

所以对于 BS,它应该是(使用 css 选择器):

data = soup.select('ul.listing_details li')
print(len(data))

使用 LXML:

data2 = dom.xpath('//ul[@class="listing_details"]//li')
print(len(data2))

输出应该在这两种情况下。3

评论

0赞 DCUpro 9/13/2023
谢谢杰克,是的,由于 BS 的一些限制,我同时使用 BS 和 lxml。我尝试了上面的lxml和BS解决方案。lxml 解决方案计算了所有子项,而 BS 实际上对我不起作用。有没有办法将计数限制为仅班级的直接子级,因为列表中还有另一个我不想计数的列表?
1赞 Jack Fleeting 9/13/2023
@DCUpro 很难在摘要中分辨 - 您可能需要编辑您的问题或添加更具代表性的 html 示例。
0赞 Andrej Kesely 9/14/2023 #2

如果只想选择直接子项,可以使用以下示例:

from bs4 import BeautifulSoup

html_text = """\
<div class="row">
<div class="style_details">
<ul data-id="list" class="listing_details">
<li data-id="listing-index-1"></li>
<li data-id="listing-index-2"></li>
<li data-id="listing-index-3"></li>
</ul>
</div>"""

soup = BeautifulSoup(html_text, "html.parser")

# print only direct <li> under <ul class="listing_details">
# note the " > " in the CSS selector
for li in soup.select("ul.listing_details > li"):
    print(li)

指纹:

<li data-id="listing-index-1"></li>
<li data-id="listing-index-2"></li>
<li data-id="listing-index-3"></li>

或者:使用 API:bs4

ul = soup.find("ul", class_="listing_details")
for li in ul.find_all("li", recursive=False):
    print(li)