2016-10-20 3 views
0

В python, использующем библиотеку lxml, как читать таблицы td таблиц html? Я попробовал прочитать таблицу xpath, но я не могу найти правильный параметр, чтобы вернуть значения td. Спасибо всем, я ценю это.Python - Читать таблицу

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) 

page.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

Вы знаете, как использовать XPath? –

+0

Не совсем, и я не могу найти на нем хорошую документацию. Im tyring, чтобы захватить все значения td, которые после tr align = "right", но я не могу получить синтаксис справа. – John

+0

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

ответ

1

Если вы хотите найти ТД внутри т г-х с выравниванием по правому краю, вам необходим ти фильтр с помощью выравнивания атрибута:

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

Если вы просто хотите текст из каждого ТДА:

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

Но на самом деле вы, вероятно, хотите сохранить ассоциацию, чтобы вы нужно просто найти ТРС, затем группа текст TD:

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] 

Который даст вам:

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

И если вы просто хотели каждое имя, вы можете пропустить первый TD:

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]) 

или присоединиться в одну строку:

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

Вы издеваетесь, что вы изменили ответ, основываясь на его комментарии –

+0

Он только что редактировал вопрос –

+0

@HishamKaram, я изменил какой ответ? Также правильный способ просто получить текст из td's не в '// text()', он будет вытягивать текст рекурсивно и, как указано в моем ответе, он потеряет любую ассоциацию, просто потянув весь текст в один плоский список. –

0

код

>>> 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()') 

выход:

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

Эй, у меня в списке много \ n и других барахлов. Это потому, что таблица im scrape имеет атрибуты стиля. – John

+0

Каким будет синтаксис для чтения всех значений tr align = "right"? – John