Pregunta

Soy nuevo en Python, y necesito ayuda con la sintaxis para encontrar e iterar a través de etiquetas html usando lxml. Aquí están los casos de uso con los que estoy tratando:

El archivo HTML está bastante bien formado (pero no es perfecto). Tiene varias tablas en la pantalla, una que contiene un conjunto de resultados de búsqueda y una para cada encabezado y pie de página. Cada fila de resultados contiene un enlace para el detalle de los resultados de búsqueda.

  1. Necesito encontrar la tabla central con las filas de resultados de la búsqueda (esta fue la que pude averiguar):

        self.mySearchTables = self.mySearchTree.findall(".//table")
        self.myResultRows = self.mySearchTables[1].findall(".//tr")
    
  2. Necesito encontrar los enlaces contenidos en esta tabla (aquí es donde me estoy atascando):

        for searchRow in self.myResultRows:
            searchLink = patentRow.findall(".//a")
    

    Parece que en realidad no encuentra los elementos del enlace.

  3. Necesito el texto sin formato del enlace. Me imagino que sería algo como searchLink.text si realmente obtuviera los elementos del enlace en primer lugar.

Finalmente, en la referencia de API real para lxml, no pude encontrar información sobre el hallazgo y las llamadas findall. Recogí esto de bits de código que encontré en google. ¿Me estoy perdiendo algo sobre cómo encontrar e iterar de manera efectiva las etiquetas HTML usando lxml?

¿Fue útil?

Solución

Bien, primero, con respecto al análisis del HTML: si sigue la recomendación de zweiterlinde y S.Lott, al menos use la versión de beautifulsoup incluido con lxml . De esa manera, también obtendrás el beneficio de una agradable interfaz de xpath o css selector.

Sin embargo, personalmente prefiero el analizador HTML incluido en lxml de Ian Bicking.

En segundo lugar, .find () y .findall () provienen de lxml que intenta ser compatible con ElementTree, y esos dos métodos se describen en Soporte XPath en ElementTree .

Esas dos funciones son bastante fáciles de usar pero son XPath muy limitadas. Recomiendo intentar usar el método completo lxml xpath () o, si ya está familiarizado con CSS, utilice cssselect () método .

Aquí hay algunos ejemplos, con una cadena HTML analizada como esta:

from lxml.html import fromstring
mySearchTree = fromstring(your_input_string)

Usando la clase selector de css, su programa se vería más o menos así:

# Find all 'a' elements inside 'tr' table rows with css selector
for a in mySearchTree.cssselect('tr a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

El método equivalente de xpath sería:

# Find all 'a' elements inside 'tr' table rows with xpath
for a in mySearchTree.xpath('.//tr/*/a'):
    print 'found "%s" link to href "%s"' % (a.text, a.get('href'))

Otros consejos

¿Hay alguna razón por la que no esté utilizando Beautiful Soup para este proyecto? Hará mucho más fácil tratar con documentos mal formados.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top