2011-04-07 23 views
13

tengo un documento HTML similar al siguiente:XPath lxml de tabla html

<html xmlns="http://www.w3.org/1999/xhtml" xmlns="http://www.w3.org/1999/xhtml"> 
    <div id="Symbols" class="cb"> 
    <table class="quotes"> 
    <tr><th>Code</th><th>Name</th> 
     <th style="text-align:right;">High</th> 
     <th style="text-align:right;">Low</th> 
    </tr> 
    <tr class="ro" onclick="location.href='/xyz.com/A.htm';" style="color:red;"> 
     <td><a href="/xyz.com/A.htm" title="Display,A">A</a></td> 
     <td>A Inc.</td> 
     <td align="right">45.44</td> 
     <td align="right">44.26</td> 
    <tr class="re" onclick="location.href='/xyz.com/B.htm';" style="color:red;"> 
     <td><a href="/xyz.com/B.htm" title="Display,B">B</a></td> 
     <td>B Inc.</td> 
     <td align="right">18.29</td> 
     <td align="right">17.92</td> 
</div></html> 

necesito para extraer code/name/high/low información de la tabla.

utilicé siguiente código de uno de los ejemplos similares en la pila sobre el flujo:

############################# 
import urllib2 
from lxml import html, etree 

webpg = urllib2.urlopen(http://www.eoddata.com/stocklist/NYSE/A.htm).read() 
table = html.fromstring(webpg) 

for row in table.xpath('//table[@class="quotes"]/tbody/tr'): 
    for column in row.xpath('./th[position()>0]/text() | ./td[position()=1]/a/text() | ./td[position()>1]/text()'): 
     print column.strip(), 
    print 

############################# 

estoy recibiendo ninguna salida. Tengo que cambiar el primer bucle de XPath a table.xpath('//tr') de table.xpath('//table[@class="quotes"]/tbody/tr')

Simplemente no entiendo por qué el xpath('//table[@class="quotes"]/tbody/tr') no funciona.

+0

encontré mi problema. De alguna manera, la etiqueta fue eliminada. De Firebug, el aparece justo después de

y antes de la etiqueta . – mkt2012

+0

Sí, esto es ** Preguntas frecuentes: los navegadores agregan elementos HTML obligatorios (X) (como 'head' y' tbody') a DOM. ** Por cierto, esto es exactamente lo que @samplebias '[answer] (http: // stackoverflow.com/questions/5586296/problem-with-lxml-xpath-for-html-table-extracting/5586627#5586627) say. –

+0

posible duplicado de [Problema de Python lxml XPath] (http://stackoverflow.com/questions/5333236/python-lxml-xpath-problem) –

Respuesta

34

Probablemente estés mirando el HTML en Firebug, ¿correcto? El navegador insertará la etiqueta implícita <tbody> cuando no esté presente en el documento. La biblioteca lxml solo procesará las etiquetas presentes en la cadena HTML sin procesar.

Omita tbody nivel en su XPath. Por ejemplo, esto funciona:

tree = lxml.html.fromstring(raw_html) 
tree.xpath('//table[@class="quotes"]/tr') 
[<Element tr at 1014206d0>, <Element tr at 101420738>, <Element tr at 1014207a0>] 
+5

Experimenté esto con Chrome también. Estaba usando su función 'Copiar XPath' en el menú 'Examinar' del botón derecho. Un poco tonto. – ficuscr

+0

¿Conoces alguna otra "regla de cambio de ruta" que pueda suceder en FF/Chrome? Sería interesante compilarlos. – lajarre

Cuestiones relacionadas