BeautifulSoup 搜索属性值
BeautifulSoup search attributes-value
我正在尝试在 HTML 文档中搜索特定属性值。
例如
<html>
<h2 itemprop="prio1"> TEXT PRIO 1 </h2>
<span id="prio2"> TEXT PRIO 2 </span>
</html>
我想查找属性值以 "prio"
开头的所有项目
我知道我可以做类似的事情:
soup.find_all(itemprop=re.compile('prio.*')) )
或
soup.find_all(id=re.compile('prio.*')) )
但我要找的是这样的东西:
soup.find_all(*=re.compile('prio.*')) )
我不知道这是否是最好的方法,但这行得通:
>>> soup.find_all(lambda element: any(re.search('prio.*', attr) for attr in element.attrs.values()))
[<h2 itemprop="prio1"> TEXT PRIO 1 </h2>, <span id="prio2"> TEXT PRIO 2 </span>]
在这种情况下,您可以在 lambda element:
中使用 lambda
访问元素。我们在 element.attrs.values()
列表中搜索 'prio.*'
使用 re.search
。
然后,我们在结果上使用any()
来查看是否有一个元素具有属性并且它的值以'prio'
开头。
您也可以在此处使用 str.startswith
而不是 RegEx,因为您只是想检查属性值是否以 'prio'
开头,如下所示:
soup.find_all(lambda element: any(attr.startswith('prio') for attr in element.attrs.values())))
首先你的正则表达式是错误的,如果你只想找到以 prio 开头的字符串,你可以使用 ^
作为前缀,因为你的正则表达式将匹配 prio字符串中的任何位置,如果您要搜索每个属性,您应该只使用 str.startswith:
h = """<html>
<h2 itemprop="prio1"> TEXT PRIO 1 </h2>
<span id="prio2"> TEXT PRIO 2 </span>
</html>"""
soup = BeautifulSoup(h, "lxml")
tags = soup.find_all(lambda t: any(a.startswith("prio") for a in t.attrs.values()))
如果您只想检查某些属性:
tags = soup.find_all(lambda t: t.get("id","").startswith("prio") or t.get("itemprop","").startswith("prio"))
但是如果您想要一个更有效的解决方案,您可能需要查看 lxml,它允许您使用通配符:
from lxml import html
xml = html.fromstring(h)
tags = xml.xpath("//*[starts-with(@*,'prio')]")
print(tags)
或者只是 id 一个 itemprop:
tags = xml.xpath("//*[starts-with(@id,'prio') or starts-with(@itemprop, 'prio')]")
我正在尝试在 HTML 文档中搜索特定属性值。 例如
<html>
<h2 itemprop="prio1"> TEXT PRIO 1 </h2>
<span id="prio2"> TEXT PRIO 2 </span>
</html>
我想查找属性值以 "prio"
开头的所有项目我知道我可以做类似的事情:
soup.find_all(itemprop=re.compile('prio.*')) )
或
soup.find_all(id=re.compile('prio.*')) )
但我要找的是这样的东西:
soup.find_all(*=re.compile('prio.*')) )
我不知道这是否是最好的方法,但这行得通:
>>> soup.find_all(lambda element: any(re.search('prio.*', attr) for attr in element.attrs.values()))
[<h2 itemprop="prio1"> TEXT PRIO 1 </h2>, <span id="prio2"> TEXT PRIO 2 </span>]
在这种情况下,您可以在 lambda element:
中使用 lambda
访问元素。我们在 element.attrs.values()
列表中搜索 'prio.*'
使用 re.search
。
然后,我们在结果上使用any()
来查看是否有一个元素具有属性并且它的值以'prio'
开头。
您也可以在此处使用 str.startswith
而不是 RegEx,因为您只是想检查属性值是否以 'prio'
开头,如下所示:
soup.find_all(lambda element: any(attr.startswith('prio') for attr in element.attrs.values())))
首先你的正则表达式是错误的,如果你只想找到以 prio 开头的字符串,你可以使用 ^
作为前缀,因为你的正则表达式将匹配 prio字符串中的任何位置,如果您要搜索每个属性,您应该只使用 str.startswith:
h = """<html>
<h2 itemprop="prio1"> TEXT PRIO 1 </h2>
<span id="prio2"> TEXT PRIO 2 </span>
</html>"""
soup = BeautifulSoup(h, "lxml")
tags = soup.find_all(lambda t: any(a.startswith("prio") for a in t.attrs.values()))
如果您只想检查某些属性:
tags = soup.find_all(lambda t: t.get("id","").startswith("prio") or t.get("itemprop","").startswith("prio"))
但是如果您想要一个更有效的解决方案,您可能需要查看 lxml,它允许您使用通配符:
from lxml import html
xml = html.fromstring(h)
tags = xml.xpath("//*[starts-with(@*,'prio')]")
print(tags)
或者只是 id 一个 itemprop:
tags = xml.xpath("//*[starts-with(@id,'prio') or starts-with(@itemprop, 'prio')]")