2009-11-14 11 views
7

Ich versuche META Schlüsselwörter und Beschreibung Tags von beliebigen Websites zu kratzen. Ich habe offensichtlich keine Kontrolle über diese Webseite, also muss ich nehmen, was ich bekomme. Sie haben eine Vielzahl von Hüllen für das Tag und die Attribute, was bedeutet, dass ich case-insensitiv arbeiten muss. Ich kann nicht glauben, dass die Autoren der LXML so hartnäckig sind, dass sie darauf bestehen, dass die Standards vollständig eingehalten werden, wenn sie einen Großteil der Nutzung ihrer Bibliothek ausschließt.Ist es möglich, dass lxml nicht zwischen Groß- und Kleinschreibung unterscheidet?

Ich möchte in der Lage sein doc.cssselect('meta[name=description]') zu sagen (oder eine XPath-Äquivalent), aber dies wird <meta name="Description" Content="..."> Tags durch othe captial D. nicht

ich dies derzeit als Behelfslösung verwenden bin fangen, aber es ist schrecklich!

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 

Es scheint, dass der Tag-Name meta Fall-unsensibel behandelt wird, aber die Attribute nicht. Es wäre noch ärgerlicher meta war auch Groß-und Kleinschreibung!

Antwort

6

Die Werte der Attribute müssen von der Groß-/Kleinschreibung abhängig sein.

Sie können beliebige reguläre Ausdrücke verwenden, um ein Element zu wählen:

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

Ausgang:

<meta name="Description"> 
<meta name="description"> 
<meta name="description"> 
<meta name="description"> 
+1

sehr cool, ich habe nie bemerkt, dass lxml EXSLT-Unterstützung .. – mykhal

2

lxml ist ein XML-Parser. XML unterscheidet zwischen Groß- und Kleinschreibung. Sie analysieren HTML, daher sollten Sie einen HTML-Parser verwenden. BeautifulSoup ist sehr beliebt. Es ist nur ein Nachteil, dass es langsam sein kann.

+2

'lxml.html',' lxml.html.soupparser' und 'lxml.html.html5parser' HTML-Parser zur Verfügung stellen. – jfs

+1

BeautifulSoup schneidet das Markup auf vielen Seiten ab, insbesondere mit Javascript, das Strings mit Tags enthält. lxml nicht, deshalb wollte ich lxml verwenden. – Mat

+1

@Mat: [Schöne Suppe 4 kann 'lxml' als Parser verwenden] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser). – jfs