【问题标题】:Is it possible for lxml to work in a case-insensitive manner?lxml 是否可以以不区分大小写的方式工作?
【发布时间】:2009-11-14 12:35:07
【问题描述】:

我正在尝试从任意网站上抓取 META 关键字和描述标签。我显然无法控制上述网站,所以必须接受我所得到的。它们有各种标签和属性的大小写,这意味着我需要不区分大小写。我不敢相信 lxml 作者会固执地坚持完全强制标准合规,因为它排除了对其库的大部分使用。

我希望能够说 doc.cssselect('meta[name=description]')(或某些 XPath 等效项),但由于其他大写字母 D,这不会捕获 <meta name="Description" Content="..."> 标记。

我目前正在使用它作为解决方法,但这太可怕了!

for meta in doc.cssselect('meta'):
    name = meta.get('name')
    content = meta.get('content')

    if name and content:
        if name.lower() == 'keywords':
            keywords = content
        if name.lower() == 'description':
            description = content

标签名称meta 似乎不区分大小写,但属性不是。更烦人的是meta也是区分大小写的!

【问题讨论】:

    标签: python css-selectors lxml case-sensitive case-insensitive


    【解决方案1】:

    属性必须区分大小写。

    您可以使用任意正则表达式来选择一个元素:

    #!/usr/bin/env python
    from lxml import html
    
    doc = html.fromstring('''
        <meta name="Description">
        <meta name="description">
        <META name="description">
        <meta NAME="description">
    ''')
    for meta in doc.xpath('//meta[re:test(@name, "^description$", "i")]',
                          namespaces={"re": "http://exslt.org/regular-expressions"}):
        print html.tostring(meta, pretty_print=True),
    

    输出:

    <meta name="Description">
    <meta name="description">
    <meta name="description">
    <meta name="description">
    

    【讨论】:

      【解决方案2】:

      lxml 是一个 XML 解析器。 XML 区分大小写。您正在解析 HTML,因此您应该使用 HTML 解析器。 BeautifulSoup 很受欢迎。它唯一的缺点是它可能很慢。

      【讨论】:

      • lxml.htmllxml.html.soupparserlxml.html.html5parser 提供 HTML 解析器。
      • BeautifulSoup 在很多页面的标记上都存在错误,尤其是在 Javascript 中包含带有标签的字符串时。 lxml 没有,因此我想使用 lxml。
      【解决方案3】:

      你可以使用

      doc.cssselect.xpath("//meta[translate(@name,
          'ABCDEFGHJIKLMNOPQRSTUVWXYZ', 'abcdefghjiklmnopqrstuvwxyz')='description']")
      

      它将“name”的值转换为小写,然后匹配。

      另见:

      【讨论】:

      • 您是否只需要翻译“描述”中的字母(或您要比较的任何值)? ..."//meta[translate(@name, 'DESCRIPTON', 'descripton')='description']"
      猜你喜欢
      • 2011-02-05
      • 1970-01-01
      • 2014-03-08
      • 1970-01-01
      • 1970-01-01
      • 2010-12-24
      相关资源
      最近更新 更多