2013-01-17 85 views
0

LXML我需要分析以下結構的HTML表格:解析HTML表格可以用Python

<table class="table1" width="620" cellspacing="0" cellpadding="0" border="0"> 
<tbody> 
    <tr width="620"> 
    <th width="620">Smth1</th> 
    ... 
    </tr> 
    <tr bgcolor="ffffff" width="620"> 
    <td width="620">Smth2</td> 
    ... 
    </tr> 
    <tr bgcolor="E4E4E4" width="620"> 
    <td width="620">Smth3</td> 
    ... 
    </tr> 
    <tr bgcolor="ffffff" width="620"> 
    <td width="620">Smth4</td> 
    ... 
    </tr> 
</tbody> 
</table> 

Python代碼:

r = requests.post(url,data) 
html = lxml.html.document_fromstring(r.text) 
rows = html.xpath(xpath1)[0].findall("tr") 
#Getting Xpath with FireBug 
data = list() 
for row in rows: 
    data.append([c.text for c in row.getchildren()]) 

但我得到這個在第三行:

IndexError: list index out of range 

任務是從這裏形成python字典。行數可能不同。

UPD。 更改了我得到html代碼的方式,以避免請求lib可能出現的問題。現在,它是一個簡單的網址:

html = lxml.html.parse(test_url) 

這證明everyting是確定的HTML:

lxml.html.open_in_browser(html) 

但還是同樣的問題:

rows = html.xpath(xpath1)[0].findall('tr') 
data = list() 
for row in rows: 
    data.append([c.text for c in row.getchildren()]) 

這裏是xpath1:

'/html/body/table/tbody/tr[5]/td/table/tbody/tr/td[2]/table/tbody/tr/td/center/table' 

UPD2。通過實驗發現,XPath的崩潰上:

xpath1 = '/html/body/table/tbody' 
print html.xpath(xpath1) 
#print returns [] 

如果xpath1較短,那麼它seeem運作良好,爲xpath1 = '/html/body/table'

+1

專業提示:請包括python錯誤的*完整*追蹤,以減少任何人幫助你的猜測。 –

回答

4

您不包括XPath的,所以我不知道你想做什麼,但如果我理解正確的話,這應該工作

xpath1 = "tbody/tr" 
r = requests.post(url,data) 
html = lxml.html.fromstring(r.text) 
rows = html.xpath(xpath1) 
data = list() 
for row in rows: 
    data.append([c.text for c in row.getchildren()]) 

這是使一個項目清單列出不過,像這樣:

[['Smth1'], ['Smth2'], ['Smth3'], ['Smth4']] 

要讓值的簡單列表,您可以使用此代碼

xpath1 = "tbody/tr/*/text()" 
r = requests.post(url,data) 
html = lxml.html.fromstring(r.text) 
data = html.xpath(xpath1) 

這都假設r.text正是你在那裏發佈的。

+0

描述了UPD中的所有變化,但問題仍然存在 –

0

.xpath(xpath1) XPath表達式返回[<Element table at 0x2cbadb0>]未能找到任何元素。檢查表達式是否有錯誤。

+0

包含XPath1到描述中,再次用FireBug –

+0

運行'print html.xpath(xpath1)'來測試,而不是在FireBug中檢查它。 –

+0

描述了UPD2中的情況 –