9

我正在尝试从任意网站上抓取 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如果区分大小写,那就更烦人了!

4

3 回答 3

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">
于 2009-11-14T13:23:48.947 回答
2

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

于 2009-11-14T13:06:10.453 回答
0

您可以使用

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

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

也可以看看:

于 2012-02-13T16:56:34.813 回答