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 method を提供していることを考えると、私の現在の答えは間違いなくpandas -basedです。

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

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() は、c1、t2、c2、t2、... c5、t5 を含む 10 列を生成します。c1..c5 情報を使用して、t1..t5 がどのセルにある必要があるかを知ることができます。

于 2013-05-27T17:05:51.043 に答える
1

標準ライブラリ モジュールのElementTreeminidomを確認する必要があります。

于 2013-05-25T11:01:40.593 に答える