我正在寻找一种将HTML表格干净地转换为可读纯文本的方法。
即。给出一个输入:
<table>
<tr>
<td>Height:</td>
<td>200</td>
</tr>
<tr>
<td>Width:</td>
<td>440</td>
</tr>
</table>
我期待输出:
Height: 200
Width: 440
我不想使用外部工具,例如w3m -dump file.html
,因为它们是(1)依赖于平台的,(2)我希望对这个过程有一些控制权。(3)我认为只用Python就可以使用或不使用额外的模块。
我不需要任何自动换行或可调节的细胞分离器宽度。将标签作为单元格分隔符就足够了。
对于旧的用例来说,这是一个老问题。鉴于pandas provides the read_html method,我目前的答案肯定是pandas-based。
答案 0 :(得分:4)
如何使用它:
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
答案 1 :(得分:1)
您应该查看标准库模块ElementTree和minidom
答案 2 :(得分: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应该在哪些单元格中。