gpt4 book ai didi

python - BeautifulSoup 选择器无法匹配任意标签?

转载 作者:行者123 更新时间:2023-12-01 04:39:38 26 4
gpt4 key购买 nike

我想获取带有data-a属性的标签。我认为正确的选择器返回一个空白列表。

如何使用 CSS 选择器成功选择带有 data-a 的标签?

In [53]: s = BeautifulSoup("<div data-a='12'></div>")

In [54]: s
Out[54]: <html><body><div data-a="12"></div></body></html>


In [55]: s.select('div')
Out[55]: [<div data-a="12"></div>]

In [56]: s.select('[data-a]')
Out[56]: []

最佳答案

这是 BeautifulSoup CSS 选择器实现中的一个已知限制;它只会将属性名称与字母、数字和下划线匹配,而不是破折号。请参阅issue #1304007 .

您仍然可以通过 find_all() 调用来选择这些元素:

>>> s.find_all(**{'data-a': True})
[<div data-a="12"></div>]

**{..} 应用任意关键字参数; data-a 不是有效的 Python 标识符,因此我们需要使用解决方法。 True 表示具有此属性的任何元素

您也可以修补代码以接受属性名称中的破折号:

import re
from bs4 import PageElement

PageElement.attribselect_re = re.compile(
r'^(?P<tag>\w+)?\[(?P<attribute>[\w-]+)(?P<operator>[=~\|\^\$\*]?)' +
r'=?"?(?P<value>[^\]"]*)"?\]$'
)

更新后的表达式与破折号匹配属性有效:

>>> import re
>>> from bs4 import PageElement
>>> s.select('[data-a]')
[]
>>> PageElement.attribselect_re = re.compile(
... r'^(?P<tag>\w+)?\[(?P<attribute>[\w-]+)(?P<operator>[=~\|\^\$\*]?)' +
... r'=?"?(?P<value>[^\]"]*)"?\]$'
... )
>>> s.select('[data-a]')
[<div data-a="12"></div>]

关于python - BeautifulSoup 选择器无法匹配任意标签?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31003826/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com