【问题标题】:BeautifulSoup selectors fail to match arbitary tags?BeautifulSoup 选择器无法匹配任意标签?
【发布时间】:2015-09-09 07:32:00
【问题描述】:

我想获取带有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]: []

【问题讨论】:

    标签: python css beautifulsoup


    【解决方案1】:

    这是 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>]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2010-12-14
      • 2021-09-15
      • 2019-04-17
      • 1970-01-01
      • 2020-03-28
      • 2019-10-18
      • 2020-03-06
      相关资源
      最近更新 更多