lxml是否可能以不区分大小写的方式工作?

时间:2009-11-14 12:35:08

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

我正试图从任意网站上搜索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也是区分大小写的!

3 个答案:

答案 0 :(得分:7)

属性

必须区分大小写。

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

#!/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">

答案 1 :(得分:2)

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

答案 2 :(得分:0)

您可以使用

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

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

另见: