HTMLからネストされたテーブルを抽出する方法は?
-
09-09-2019 - |
質問
HTMLファイル(UTF-8でエンコード)があります。で開きます codecs.open()
. 。ファイルアーキテクチャは次のとおりです。
<html>
// header
<body>
// some text
<table>
// some rows with cells here
// some cells contains tables
</table>
// maybe some text here
<table>
// a form and other stuff
</table>
// probably some more text
</body></html>
最初のテーブルのみを取得する必要があります(フォームのあるテーブルを破棄します)。最初にすべての入力を省略します <table>
そして、それに対応した後 </table>
. 。一部のセルには、段落、太字、スクリプトも含まれています。メインテーブルの行ごとにネストされたテーブルが1つしかありません。
それを抽出して、各要素がプレーン(Unicode文字列)セルのデータと、ネストされた各テーブルの行のリストを保持する行のリストを取得するにはどうすればよいですか?ネストには1レベル以下です。
HTMLParse、Pyparse、REモジュールを試しましたが、これを機能させることはできません。私はPythonにかなり初めてです。
解決
試す 美しいスープ
原則として、実際のパーサー(美しいスープは)を使用する必要があります。正規表現は、コンピューターサイエンスの理由でネストされた要素に対処できません(有限の状態マシンは、コンテキストのない文法、IIRCを解析できません)
他のヒント
あなたは好きかもしれません LXML. 。あなたがその構造で何をしたいのか本当に理解していたかどうかはわかりませんが、この例が役立つかもしれません...
import lxml.html
def process_row(row):
for cell in row.xpath('./td'):
inner_tables = cell.xpath('./table')
if len(inner_tables) < 1:
yield cell.text_content()
else:
yield [process_table(t) for t in inner_tables]
def process_table(table):
return [process_row(row) for row in table.xpath('./tr')]
html = lxml.html.parse('test.html')
first_table = html.xpath('//body/table[1]')[0]
data = process_table(first_table))
HTMLがよく形成されている場合は、それをDOMツリーに解析し、XPathを使用して必要なテーブルを抽出できます。私は通常使用します LXML XMLを解析するために HTMLも解析できます.
最初のテーブルを引き出すためのXpathは「//テーブル[1]」です。
所属していません StackOverflow