1

我正在寻找一种将 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 提供了 read_html 方法,我目前的答案肯定是基于 pandas 的

4

3 回答 3

4

如何使用这个:

将 HTML 表解析为 Python 列表?

但是,使用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
于 2013-05-25T11:06:23.023 回答
1

您应该查看标准库模块ElementTreeminidom

于 2013-05-25T11:01:40.593 回答
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 应该在哪些单元格中。

于 2013-05-27T17:05:51.043 回答