如何在BeautifulSoup4中从HTML标签中查找特定数据属性?

28 投票
4 回答
40148 浏览
提问于 2025-04-18 09:38

有没有办法仅通过HTML中的数据属性来找到一个元素,然后获取它的值呢?

比如,在一个HTML文档中有这样一行:

<ul data-bin="Sdafdo39">

我该如何通过搜索整个HTML文档,找到带有 data-bin 属性的元素,从而获取 Sdafdo39 这个值呢?

4 个回答

2

如果你更喜欢通过 select() 来使用 CSS 选择器,而不是用 find_all(),可以考虑这个替代方案:

from bs4 import BeautifulSoup
html_doc = """<ul class="foo">foo</ul><ul data-bin="Sdafdo39">"""
soup = BeautifulSoup(html_doc)

# Select
soup.select('ul[data-bin]')
4

你可以用gazpacho这个工具,轻松解决这个问题,只需要几行代码:

首先,你需要导入这个工具,然后把网页的html内容变成一个叫做Soup的对象:

from gazpacho import Soup

html = """<ul data-bin="Sdafdo39">"""
soup = Soup(html)

接着,你只需要查找“ul”这个标签,然后提取它的href属性:

soup.find("ul").attrs["data-bin"]
# Sdafdo39
43

更准确一点

[item['data-bin'] for item in bs.find_all('ul', attrs={'data-bin' : True})]

这样,循环出来的列表只包含你想要查找的属性的

    元素。

    from bs4 import BeautifulSoup
    bs = BeautifulSoup(html_doc)
    html_doc = """<ul class="foo">foo</ul><ul data-bin="Sdafdo39">"""
    [item['data-bin'] for item in bs.find_all('ul', attrs={'data-bin' : True})]
    

18

你可以使用 find_all 方法来获取所有的标签,然后根据标签的属性中的 "data-bin" 来过滤,这样就能找到我们想要的那个标签。接着,我们可以很简单地提取出与之对应的值,像这样:

from bs4 import BeautifulSoup
html_doc = """<ul data-bin="Sdafdo39">"""
bs = BeautifulSoup(html_doc)
print [item["data-bin"] for item in bs.find_all() if "data-bin" in item.attrs]
# ['Sdafdo39']

撰写回答