2016-10-20 5 views
0

In Python mit der LXML-Bibliothek Wie lese ich eine HTML-Tabellen Td-Werte? Ich habe versucht, die Xpath-Tabelle zu lesen, aber ich kann nicht den richtigen Parameter finden, um die td-Werte zurückzugeben. Danke allen, ich weiß es zu schätzen.Python - Tabelle lesen

import sys 
from glob import * 
from lxml import etree, html 
import requests 
#Scan directory (current) and scrape the html files 
dirScan = glob('html/*.*') 
fileCount = 0 
while(fileCount < len(dirScan)): 
    fileName = dirScan[fileCount] 
    page = open(fileName) 
    tree = html.fromstring(page.read()) 
    tables = tree.xpath('//table') 
    print("Tables:",tables) 

seite.html

<table style="width:100%"> 
<tr align="right"><td>1</td><td>John</td><td>Smith</td> 
<tr align="right"><td>2</td><td>Tody</td><td>Miller</td> 
</table> 
+0

Wissen Sie, wie ein XPath zu benutzen? –

+0

Nicht wirklich, und ich kann keine gute Dokumentation darüber finden. Ich möchte alle td-Werte nach dem tr align = "right" holen, aber ich kann die Syntax nicht richtig machen. – John

+0

http://www.w3schools.com/xml/xpath_intro.asp 'xpath (" // table/tr [@ align = 'rechts']/td ")' –

Antwort

1

Wenn Sie die td des innerhalb der t finden wollen r die mit align rechts, müssen Sie ti Filter das align-Attribut:

tds = tree.xpath("//table/tr[@align='right']/td") 

Wenn Sie nur den Text aus jedem td wollen:

.xpath("//table/tr[@align='right']/td/text()") 

Aber wirklich wollen Sie wahrscheinlich den Verein zu halten, so dass Sie finden sollte nur die trs, dann die Gruppe den td Text:

x = """<table style="width:100%"> 
<tr align="right"><td>1</td><td>John</td><td>Smith</td> 
<tr align="right"><td>2</td><td>Tody</td><td>Miller</td> 
</table> """ 

from lxml import html 

tree = html.fromstring(x) 

# first get the trs, filtering by attribute 
trs = tree.xpath("//table/tr[@align='right']") 

# then extract the tds from each tr 
data = [row.xpath("td/text()") for row in trs] 

Was würden Sie:

[['1', 'John', 'Smith'], ['2', 'Tody', 'Miller']] 

Und wenn Sie nur jeden Namen gesucht, können Sie die ersten td überspringen könnte:

trs = tree.xpath("//table/tr[@align='right']") 

# position() > 1, all but the first td, xpath has one based indexing. 
names = [row.xpath("td[position()> 1]/text()") for row in trs]) 

Oder kommen Sie in eine einzelne Saite:

full_names [" ".join(row.xpath("td[position()> 1]/text()")) for row in trs] 
+0

Willst du mich verarschen, hast du die Antwort aufgrund seines Kommentars geändert –

+0

Er hat gerade die Frage –

+0

@HishamKaram bearbeitet, ich habe die Antwort geändert? Der richtige Weg, um Text nur von tds zu bekommen, ist nicht '// text()', er würde den Text rekursiv ziehen, und wie in meiner Antwort erwähnt, würde er jegliche Assoziation verlieren, indem er einfach den ganzen Text in eine flache Liste zieht. –

0

Code

>>> page="""<table style="width:100%"> 
     <tr> 
     <th>Id</th> 
     <th>Name</th> 
     <th>Age</th> 
     </tr> 
     <tr> 
     <td>1</td> 
     <td>Smith</td> 
     <td>50</td> 
     </tr> 
     <tr> 
     <td>2</td> 
     <td>Jackson</td> 
     <td>94</td> 
     </tr> 
     <tr> 
     <td>3</td> 
     <td>Miller</td> 
     <td>43</td> 
     </tr> 
    </table> """ 
    >>> tree=html.fromstring(s) 
    >>> tree.xpath('//tr/td//text()') 

Ausgang:

['1', 'Smith', '50', '2', 'Jackson', '94', '3', 'Miller', '43'] 
+0

Hey meine Liste hat eine Menge \ n und andere Junk. Liegt es daran, dass die Tabelle im scrape Stilattribute hat? – John

+0

Wie lautet die Syntax zum Lesen aller tr align = "right" -Werte? – John