如何在BeautifulSoup4中从HTML标签中查找特定数据属性?
有没有办法仅通过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']