用于将HTML表转换为可读纯文本的Python解决方案

时间:2013-05-25 10:51:54

标签: python html html-table html-parsing plaintext

我正在寻找一种将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

3 个答案:

答案 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)

您应该查看标准库模块ElementTreeminidom

答案 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应该在哪些单元格中。