2016-05-16 6 views
1

lxmlを使用してテキストをhtmlテーブルに挿入しようとしています。lxmlでテーブルにテキストを挿入

テーブルはシンプルで、ヘッダーは1つです。そして、私はアイテムのリストを解析したい、これらのアイテムのそれぞれは、テーブルの行を持つ必要があります。そのように:

-------- 
| HEAD | 
-------- 
| Item | 
-------- 
| Item | 
-------- 

私は、パスとテンプレートをとる関数を作成しました。パスはページを保存するためのパスで、テンプレートはデータの挿入に使用する.htmlです。

def genereate_page(path, template): 
    tree = html.parse(template) 
    root = tree.getroot() 

    items = ['Item1', 'Item2', 'Item3', 'Item4'] 

    table = root.findall('.//*[@table="results"]') 

    for i in items: 
     row = etree.Element('tr') 
     data = etree.Element('td') 
     data.text = i 
     row.append(data) 
     table.append(row) 

    with open(path, 'w') as f: 
     f.write(etree.tostring(root, pretty_print=True).decode('utf-8')) 

マイテンプレートファイルは、次のようになります:私のコードは次のようになります

<html> 
    <head> 
    <title>example</title> 
    </head> 
    <body> 
    <table id="results"> 
     <tr id="header_row"> 
     <th>Test</th> 
    </table> 
    </body> 
</html> 

すべてがコンパイルし、エラーが与えられていないが、何のテキストが今までに挿入されていません。テンプレートが返されるだけですが、header_rowを閉じるので、何かが起こっています。 lxmlを使用して項目のリストからテーブルにテキストを挿入するにはどうすればよいですか?

答えて

2

現在、table変数はリストで、table.append()はリストに項目を追加するだけです。一つだけのテーブルがHTMLでありますので、あなたはテーブル要素を取得する代わりにfindall()find()を使用することができ、その後、正しくに子要素を追加します。働い

table = root.find('.//*[@id="results"]') 

for i in items: 
    row = etree.Element('tr') 
    data = etree.Element('td') 
    data.text = i 
    row.append(data) 
    table.append(row) 
+0

感謝を!テーブルを見つけるために[@ table = "results"]の代わりに[@ id = "results"]を使用する理由はありますか? – cenh

+1

@cenhあなたのHTMLテンプレートでは、 'results'は 'id'属性の値であり、' table'属性ではありません(テンプレート内にtableという名前の属性もありません)。 '@ attribute_name'はXPathでHTML属性を参照する方法です。 – har07

関連する問題