7

Estoy tratando de raspar META palabras clave y etiquetas de descripción de sitios web arbitrarios. Obviamente no tengo control sobre dicho sitio web, así que tengo que tomar lo que me dan. Tienen una variedad de envolturas para la etiqueta y los atributos, lo que significa que necesito trabajar sin tener en cuenta las mayúsculas y minúsculas. No puedo creer que los autores de lxml sean tan tercos como para insistir en el cumplimiento total de las normas obligatorias cuando excluye gran parte del uso de su biblioteca.¿Es posible que lxml funcione de manera que no distinga entre mayúsculas y minúsculas?

Me gustaría poder decir doc.cssselect('meta[name=description]') (o algún equivalente XPath), pero esto no cogerá <meta name="Description" Content="..."> etiquetas debido othe captial D.

Actualmente estoy usando esto como una solución, pero es horrible!

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 

Parece ser que el nombre de la etiqueta meta se trata mayúsculas y minúsculas, pero los atributos no lo son. ¡Sería incluso más molesto que meta fuera sensible a mayúsculas y minúsculas también!

Respuesta

6

valores de los atributos deben entre mayúsculas y minúsculas.

Puede utilizar expresiones regulares arbitrarias para seleccionar 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), 

Salida:

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

muy bueno, nunca he notado que el soporte EXXLX EXSLT .. – mykhal

2

lxml es un analizador XML. XML distingue entre mayúsculas y minúsculas. Está analizando HTML, por lo que debe usar un analizador HTML. BeautifulSoup es muy popular. Su único inconveniente es que puede ser lento.

+2

'lxml.html',' lxml.html.soupparser', y 'lxml.html.html5parser' proporcionar analizadores HTML. – jfs

+1

BeautifulSoup barfs en el marcado en muchas páginas, particularmente con Javascript que contiene cadenas con etiquetas dentro de ellas. lxml no, por lo tanto, por qué quería usar lxml. – Mat

+1

@Mat: [Beautiful Soup 4 puede usar 'lxml' como analizador] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser). – jfs

Cuestiones relacionadas