1

HTMLのテーブルからデータを読み込もうとしています。私は定期的に読んでいますが、テーブルの長さは常に変化し、その長さはわかりません。ただし、テーブルは常に同じ形式であるため、パターンを認識し、その位置に基づいてデータを読み取ろうとします。html の形式は次のとおりです。

<head>
<title>Some webside</title>
</head>
<body 
<tr><td> There are some information coming here</td></tr>
<tbody><table>
<tr><td><a href="d?k=101">First</a></td><td>London</td><td>24</td><td>3</td><td>19:00</td><td align="center"></td></tr>
<tr bgcolor="#cccccc"><td><a href="d?k=102">Second</a></td><td>NewYork</td><td>24</td><td>4</td><td>20:13</td><td align="center"></td></tr>
<tr><td><a href="d?k=201">Some surprise</a></td><td>Swindon</td><td>25</td><td>5</td><td>20:29</td><td align="center"></td></tr>
<tr bgcolor="#cccccc"><td><a href="d?k=202">Third</a></td><td>Swindon</td><td>24</td><td>6</td><td>20:45</td><td align="center"></td></tr>
</tbody></table>
<tr><td> There are some information coming here</td></tr>
</body>

私はhtmlを文字列に変換し、それを調べてデータを読み取りますが、一度だけ読み取りたいです。私のコードは次のとおりです。

def ReadTable(m):
    refList = []
    firstId = 1
    nextId = 2
    k = 1
    helper = 1
    while firstId != nextId:
        row = []
        helper = m.find('<td><a href="d?k=', helper) + 17
        end_helper = m.find('">', helper)
        rowId = m[helper : end_helper]
        if k == 1:          # to check if looped again
            firstId = rowId
        else:
            nextId = rowId      
        row.append(rowId)
        helper = end_helper + 2
        end_helper = m.find('</a></td><td>', helper)
        rowPlace = m[helper : end_helper]
        row.append(rowPlace)
        helper = m.find('</a></td><td>', end_helper) + 13
        end_helper = m.find('</td><td>', helper)
        rowCity = m[helper : end_helper]
        row.append(rowCity)
        helper = end_helper + 9
        end_helper = m.find('</td><td>', helper)
        rowDay = m[helper : end_helper]
        row.append(rowDay)
        helper = end_helper + 9
        end_helper = m.find('</td><td>', helper)
        rowNumber = m[helper : end_helper]
        row.append(rowNumber)
        helper = end_helper + 9
        end_helper = m.find('</td>', helper)
        rowTime = m[helper : end_helper]
        row.append(rowTime)
        refList.append(row)
        k +=1
    return refList

if __name__ == '__main__':
    filePath = '/home/m/workspace/Tests/mainP.html'
    fileRead = open(filePath)
    myString = fileRead.read()
    print myString
    refList = ReadTable(myString)
    print 'Final List = %s' % refList

私はそのような内部に4つのリストを持つリストとして結果を期待しています:

Final List = [['101', 'First', 'London', '24', '3', '19:00'], ['102', 'Second', 'NewYork', '24', '4', '20:13'], ['201', 'Some surprise', 'Swindon', '25', '5', '20:29'], ['202', 'Third', 'Swindon', '24', '6', '20:45']]

firstId最初のループの後、文字列が再度読み取られ、再び見つかって終了することを期待していwhile-loopます。代わりに、無限ループがあり、リストは次のようになります。

Final List = [['101', 'First', 'London', '24', '3', '19:00'], ['102', 'Second', 'NewYork', '24', '4', '20:13'], ['201', 'Some surprise', 'Swindon', '25', '5', '20:29'], ['202', 'Third', 'Swindon', '24', '6', '20:45'], ['me webside</title>\n</head>\n<body \n<tr><td> There are some information coming here</td></tr>\n<tbody><table>\n<tr><td><a href="d?k=101', 'First', 'London', '24', '3', '19:00'], ['102', 'Second', 'NewYork', '24', '4', '20:13']...

なぜhelperこのように振る舞い始めたのか理解できず、そのようなプログラムをどのように書くべきかわかりません。それを書いたり、ループを修正したりするための良い/効果的な方法を提案できますか?

4

2 に答える 2

2

LXMLを調べることに時間を費やすことをお勧めします。これにより、html ファイル内のすべてのテーブルを確認し、テーブルを構成するもののサブ要素 (行やセルなど) を操作できます。

LXML の扱いは難しくなく、文字列を

html.fromstring(somestring)

さらに、ここSOで尋ねられて回答されたlxmlの質問がたくさんあるので、作業するのに良い例を見つけるのは難しくありません

于 2012-11-24T18:21:45.217 に答える
1

検索からの戻り値をチェックしておらず、一致が見つからない場合は -1 を返しています。 http://docs.python.org/2/library/string.html#string.find 失敗すると -1 を返します

コードのこのセクションを更新したところ、期待どおりに返されるようになりました。下の最初と最後の行は上のものと一致するため、置換を見つけることができます。

    row = []
    helper = m.find('<td><a href="d?k=', helper)
    if helper == -1:
        break
    helper += 17
    end_helper = m.find('">', helper)
于 2012-11-24T20:43:12.910 に答える