Возможно ли, чтобы lxml работал без учета регистра? - PullRequest
8 голосов
/ 14 ноября 2009

Я пытаюсь очистить ключевые слова и теги 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 ]

7 голосов
/ 14 ноября 2009

Значения атрибутов должны учитывать регистр

Вы можете использовать произвольное регулярное выражение для выбора элемента:

#!/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 голосов
/ 14 ноября 2009

lxml - это анализатор XML. XML чувствителен к регистру. Вы анализируете HTML, поэтому вы должны использовать анализатор HTML. BeautifulSoup очень популярен. Единственный недостаток в том, что он может быть медленным.

0 голосов
/ 13 февраля 2012

Вы можете использовать

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

Он переводит значение "name" в нижний регистр, а затем соответствует.

Смотри также:

...