2013-05-25 39 views
0

我正在尋找一種方法將HTML表格清晰地轉換爲可讀的純文本格式。純粹的Python解決方案將HTML表格轉換爲可讀的純文本

I.e.給定輸入:

<table> 
    <tr> 
     <td>Height:</td> 
     <td>200</td> 
    </tr> 
    <tr> 
     <td>Width:</td> 
     <td>440</td> 
    </tr> 
</table> 

我期望的輸出:

Height: 200 
Width: 440 

我寧願不使用外部工具,例如(1)平臺相關,(2)我想對流程有一定的控制,(3)我認爲只用Python就可以實現,無論是否有額外的模塊。

我不需要任何文字包裝或可調整的細胞分離器寬度。將選項卡作爲單元分隔符就足夠了。

回答

3

如何使用這樣的:

Parse HTML table to Python list?

但是,使用collections.OrderedDict(),而不是簡單的字典,以維持秩序。你有一本字典之後,這是非常,非常容易得到和格式化從它的文字:

使用@Colt 45的解決方案:

import xml.etree.ElementTree 
import collections 

s = """\ 
<table> 
    <tr> 
     <th>Height</th> 
     <th>Width</th> 
     <th>Depth</th> 
    </tr> 
    <tr> 
     <td>10</td> 
     <td>12</td> 
     <td>5</td> 
    </tr> 
    <tr> 
     <td>0</td> 
     <td>3</td> 
     <td>678</td> 
    </tr> 
    <tr> 
     <td>5</td> 
     <td>3</td> 
     <td>4</td> 
    </tr> 
</table> 
""" 

table = xml.etree.ElementTree.XML(s) 
rows = iter(table) 
headers = [col.text for col in next(rows)] 
for row in rows: 
    values = [col.text for col in row] 
    for key, value in collections.OrderedDict(zip(headers, values)).iteritems(): 
     print key, value 

輸出:

Height 10 
Width 12 
Depth 5 
Height 0 
Width 3 
Depth 678 
Height 5 
Width 3 
Depth 4 
+0

謝謝你的代碼示例,但問題是它只處理一個特殊情況,而我的實際輸入有點複雜,包含很多colspans,所以它不會以我想要的方式顯示數據。以下是實際數據的示例:http://pastebin.com/yRQvz2Ww目前,我嘗試過的所有選項(elementree,lxml,BeautifulSoup)都與輸入「w3m -dump」的輸出接近。 – ccpizza

+0

這是一個完全不同的問題 - 我的意思是*給定的輸入*和*預期的輸出*不是你要求的。對於你先問的問題,我的答案正在起作用。 –

+0

我最初的例子是* generic *,最好的答案最好是* generic *。你提出的解決方案確實解決了最簡單的情況,但不是*通用*足夠。 – ccpizza

1

你可以在http://htql.net上使用HTQL模塊。

這裏是爲您的網頁的代碼示例:

import urllib2 
url='http://pastebin.com/yRQvz2Ww' 
page=urllib2.urlopen(url).read(); 

query="""<div (ID='super_frame')>1.<div (ID='monster_frame')>1.<div (ID='content_frame')>1.<div (ID='content_left')>1.<div (ID='code_frame2')>1.<div (ID='code_frame')>1.<div (ID='selectable')>1.<div (CLASS='html4strict')>1 &tx 
<table>.<tr>{ 
    c1=<td>:colspan; t1=<td>1 &tx; 
    c2=<td>2:colspan; t2=<td>2 &tx; 
    c3=<td>3:colspan; t3=<td>3 &tx; 
    c4=<td>4:colspan; t4=<td>4 &tx; 
    c5=<td>5:colspan; t5=<td>5 &tx; 
} 
""" 

for t in htql.query(page, query): 
    print('\t'.join(t)); 

的htql.query()產生10列,包括C1,T2,C2,T2,... C5,T5。你可以使用c1..c5信息來知道t1..t5應該在哪些單元格中。

+0

謝謝!真棒!有趣的東西:)圖書館的網頁瀏覽功能看起來很吸引人,速度也令人印象深刻。將在一段時間內報告我的結果。 – ccpizza