使用BeautifulSoup获取属性值

4
我希望通过BeautifulSoup获取内容中所有data-js属性的值。 输入:
<p data-js="1, 2, 3">some text..</p><p data-js="5">some 1 text</p><p data-js="4"> some 2 text. </p>

输出:

['1, 2, 3', '5', '4']

我用lxml做了这件事:
>>> content = """<p data-js="1, 2, 3">some text..</p><p data-js="5">some 1 text</p><p data-js="4"> some 2 text. </p>"""
>>> import lxml.html as PARSER
>>> root = PARSER.fromstring(content)
>>> root.xpath("//*/@data-js")
['1, 2, 3', '5', '4']

我想通过BeautifulSoup获取上述结果。
3个回答

4

这个想法是找到所有具有 data-js 属性 的元素,并将它们收集到一个列表中:

from bs4 import BeautifulSoup


data = """
<p data-js="1, 2, 3">some text..</p><p data-js="5">some 1 text</p><p data-js="4"> some 2 text. </p>
"""

soup = BeautifulSoup(data)
print [elm['data-js'] for elm in soup.find_all(attrs={"data-js": True})]

打印出 ['1, 2, 3', '5', '4']

3
可能有一种更快的使用map而不是列表推导的方法。
from bs4 import BeautifulSoup
d = "..."
# create a soup instance
soup = BeautifulSoup(d)
# find all p-elements containing an data-js attribute
p = soup.find_all('p', attrs={"data-js": True})
# unpack data-js attribute from p-elements and map to new list
print map(lambda x: x['data-js'], p)

http://www.crummy.com/software/BeautifulSoup/bs4/doc/#find-all


谢谢。已点赞,data-js属性可以是任何标签。 - Vivek Sable
@VivekSable 我知道,True 只是确保 data-js 键存在于 p 元素中。这样你就不会遇到 KeyError: 'data-js' 的错误。 - wenzul

2
你可以使用find_all()函数来实现这个功能,但你需要将属性名称放入一个字典中,因为它本身不能作为关键字参数使用。
html = BeautifulSoup(content)
data = html.find_all(attrs={'data-js': True})

更多解释请参见此处


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接