7

Sto provando a raschiare parole chiave META e tag descrittivi da siti web arbitrari. Ovviamente non ho alcun controllo su detto sito, quindi devo prendere ciò che mi viene dato. Hanno una varietà di involucri per il tag e gli attributi, il che significa che ho bisogno di lavorare senza distinzione tra maiuscole e minuscole. Non posso credere che gli autori di lxml siano così testardi da insistere sulla piena conformità agli standard forzati quando esclude gran parte dell'uso della loro biblioteca.È possibile che lxml funzioni senza distinzione tra maiuscole e minuscole?

mi piacerebbe poter dire doc.cssselect('meta[name=description]') (o qualche XPath equivalente), ma questo non prenderà <meta name="Description" Content="..."> tag dovuti Othe captial D.

Attualmente sto usando questo come una soluzione, ma è orribile!

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 

Sembra che il nome del tag meta è trattato caso insensibile, ma gli attributi non sono. Sarebbe ancora più fastidioso meta troppo sensibile al maiuscolo/minuscolo!

risposta

6

Valori degli attributi devono essere case-sensitive.

È possibile utilizzare espressioni regolari arbitraria per selezionare un elemento:

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

uscita:

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

molto bello, non ho mai notato che il supporto EXSLT di lxml .. – mykhal

2

lxml è un parser XML. XML è case-sensitive. Stai analizzando l'HTML, quindi dovresti usare un parser HTML. BeautifulSoup è molto popolare. L'unico inconveniente è che può essere lento.

+2

'lxml.html',' lxml.html.soupparser', e 'lxml.html.html5parser' fornire parser HTML. – jfs

+1

BeautifulSoup mostra il markup in molte pagine, in particolare con Javascript contenente stringhe con tag al loro interno. lxml no, quindi perché volevo usare lxml. – Mat

+1

@Mat: [Beautiful Soup 4 può usare 'lxml' come parser] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser). – jfs

Problemi correlati