7

Я пытаюсь очистить ключевые слова META и теги описания с произвольных сайтов. Я obviusly не имеют контроля над сайтом, так что я должен взять то, что мне дано. У них есть различные оболочки для тегов и атрибутов, что означает, что мне нужно работать без учета регистра. Я не могу поверить, что авторы lxml так же упорны, что настаивают на полном соблюдении принудительных стандартов, когда это исключает большую часть использования их библиотеки.Возможно ли, что lxml работает нечувствительным к регистру образом?

Я хотел бы быть в состоянии сказать doc.cssselect('meta[name=description]') (или XPath эквивалент), но это не будет ловить <meta name="Description" Content="..."> теги из-за флористику Captial 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 был чувствителен к регистру тоже!

ответ

6

Значения атрибутов must с учетом регистра.

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

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

очень круто, я никогда не замечал, что lxml EXSLT поддерживает .. – mykhal

2

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

+2

'lxml.html',' lxml.html.soupparser' и 'lxml.html.html5parser' обеспечивают HTML парсеров. – jfs

+1

BeautifulSoup barfs на разметке на большом количестве страниц, особенно с Javascript, содержащим строки с тегами внутри них. lxml не делает, поэтому я хотел использовать lxml. – Mat

+1

@Mat: [Beautiful Soup 4 может использовать 'lxml' в качестве парсера] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser). – jfs

Смежные вопросы