2011-04-07 15 views
13

Mam dokumentu HTML podobny do następującego:Wyodrębnianie lxml XPath dla tabeli 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> 

I trzeba wyodrębnić code/name/high/low informacje z tabeli.

Użyłem następujący kod z jednego z podobnych przykładów w stos na Przepływu:

############################# 
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 

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

Dostaję wyjście nic. Muszę zmienić pierwszą pętlę xpath na table.xpath('//tr') z table.xpath('//table[@class="quotes"]/tbody/tr')

Po prostu nie rozumiem, dlaczego xpath('//table[@class="quotes"]/tbody/tr') nie działa.

+0

Znalazłem mój problem. W jakiś sposób tag został usunięty. Od Firebug'a pojawia się zaraz po tagu

i przed tagiem . – mkt2012

+0

Tak, to jest ** FAQ: przeglądarki dodają obowiązkowe (X) elementy HTML (takie jak 'head' i' tbody') do DOM. ** Tak przy okazji, to jest właśnie to @samplebias [odpowiedź] (http: // stackoverflow.com/questions/5586296/problem-with-lxml-xpath-for-html-table-extracting/5586627#5586627) say. –

+0

możliwy duplikat [problemu Python lxml XPath] (http://stackoverflow.com/questions/5333236/python-lxml-xpath-problem) –

Odpowiedz

34

Prawdopodobnie patrzysz na HTML w Firebug, prawda? Przeglądarka wstawi niejawny znacznik <tbody>, gdy nie ma go w dokumencie. Biblioteka lxml przetwarza tylko tagi obecne w nieprzetworzonym ciągu HTML.

Ominięcie poziomu tbody w XPath. Na przykład działa to:

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

Doświadczyłem tego również w Chrome. Używałem funkcji 'Kopiuj XPath' w menu" Kliknij prawym przyciskiem myszy ". Kinda goofy. – ficuscr

+0

Czy znasz jakieś inne "reguły zmieniające ścieżki", które mogą się zdarzyć w FF/Chrome? Byłoby interesująco je skompilować. – lajarre

Powiązane problemy