2016-07-09 9 views
1

tr要素の親ノードを取得しようとしているときに問題が発生しましたが、すべてを反復処理しています。tr要素を使ってPython lxmlを反復する

ここには私が取り組んでいる基本的なテーブルがあります。 はAttributeError:「リスト」オブジェクトには、属性「のgetParentを持っていない

<table border=1> 
    <tbody> 
    <tr> 
    <td> 
    <p>Some text</p> 
    </td> 
    <td> 
    <p>Some more text</p> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    <p> Some more text</p> 
    </td> 
    <td> 
    <p> Some more text</p> 
    </td> 
    </tr> 
    <tr> 
    <td> 
    <p> Some more text</p> 
    </td> 
    <td> 
    <p> Some more text</p> 
    </td> 
    </tr> 
    </tbody> 
    </table> 

そしてここでは、私のPythonスクリプトは、私は、スクリプトを実行したときに、私はこのエラーを取得していlxmlの

import lxml.html 

htm = lxml.html.parse('plaintable.htm') 
tr = htm.xpath('//tr') 
for x in tr: 
    tbody = tr.getparent() 
    if tbody.index(tr) == 1: 
     print ('Success!') 
print ('Finished') 

を使用して、親ノードを取得します'

私はPythonにはとても新しいので、何か単純なものになる可能性があります。私はlxml文書を読んで、答えを見つけることができませんでした。

助けがあれば助かります。

答えて

1

trは、実際にはxpathの一致のリストです。 xは、個々のtr要素に対応 - 代わりにそれにgetparent()メソッドを呼び出します。

tr = htm.xpath('//tr') 
for x in tr: 
    tbody = x.getparent() 
    # ... 

けれども、私はループ内で何度も何度も同じ親を得ることにあまり意味が表示されていない、場合にあなたは、単一のtableを持っています要素はtbodyです。なぜ事前にそれを見つけていない。このためとして

tbody = htm.xpath("//tbody")[0] 
for x in tbody.xpath(".//tr"): 
    # ... 

I need to find the first tr in every table to build it properly

を - 私はすべてのtableの要素を反復処理し、最初のtr要素見つけるだろう:

tables = htm.xpath("//table") 
for table in tables: 
    first_tr = table.xpath(".//tr")[0] 
+0

ああ完璧に! forループでインデックスを呼び出す方法を誤解していました。私はJavaScriptに慣れていたので、苦労していました。簡単に言えば、HTML文書の表に基づいてXMLファイルを作成しています。私は現在、36種類のテーブルを扱っています。私はそれを正しく構築するためにすべてのテーブルの最初のtrを見つける必要があります – Chad

+0

@Chadは、 "私はそれを適切に構築するためにすべてのテーブルの最初のtrを見つける必要があります"のサンプルコードで更新しました。ありがとう! – alecxe

+0

親ノードを作成すると大変役立ちます。私は本当にあなたの助けに感謝します! – Chad

関連する問題