lxml可以不区分大小写地工作吗?

9 投票
3 回答
5404 浏览
提问于 2025-04-15 16:00

我正在尝试从一些随机的网站上抓取META关键词和描述标签。显然,我无法控制这些网站,所以只能接受它们提供的内容。这些标签和属性的大小写各不相同,这就意味着我需要不区分大小写地处理它们。我真不敢相信lxml的作者居然这么固执,非要坚持完全遵循标准,结果却让很多人无法好好使用他们的库。

我希望能够使用 doc.cssselect('meta[name=description]')(或者一些XPath的替代方法),但这样做无法抓到 <meta name="Description" Content="..."> 这样的标签,因为大写的D就不行。

我现在用的这个方法是个变通办法,但实在是太糟糕了!

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

你可以使用

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

这个代码会把“name”的值转换成小写,然后进行匹配。

你还可以看看:

2

lxml 是一个用来解析 XML 的工具。XML 是区分大小写的,也就是说大写和小写字母是不同的。你现在要解析的是 HTML,所以应该使用一个专门的 HTML 解析工具。BeautifulSoup 就是一个非常受欢迎的选择。不过,它的一个缺点是速度可能比较慢。

9

属性是区分大小写的,也就是说大写和小写是不同的。

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

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

撰写回答