2017-01-12 23 views
0

python lxmlのxpathメソッドでHTMLファイルを解析しようとしています。私はそれが空かないのですか<br>タグ、次のすべての文字列を見つけることを願って、私は次の要素XPath:各改行の後に文字列を返す方法

<td class='some class'> 
    <br> 
    <br> 
    <br>foo 
    <br> 
    <br>bar 
</td> 

を持っていると言います。それは、私は、XPath

['', '', 'foo', '', 'bar'] 

を返すように期待して「M、であることは、現在の私のコードは、その明白なものがある非空の文字列

['foo', 'bar'] 

のリストを生成する

element.xpath('text()[preceding-sibling::br]') 

です私はここで行方不明ですか?どのように私はそれを動作させることができますいくつかの光を捨ててください誰か?

編集:私の質問では間違って申し訳ありません。各タグの後に改行なしがあります。だから私の質問は本当に

from lxml.html import fromstring 
s = '<td class="some class"><br><br><br>foo<br><br>bar</td>' 
element = fromstring(s) 
print(element.xpath('text()[preceding-sibling::br]')) 

私は私のコードは

['', '', 'foo', '', 'bar'] 

感謝を生み出すよう変更したいの最後の行になります。アウト

答えて

0

空のタグがない場合は、ドキュメントが解析されるとノードが作成されません。そのため、クエリを実行しても結果は得られません。

代替は例えば、すぐに空のタグのためにノードまたはNoneを次のテキストコンテンツを含む、すべてのbrノードを選択し、br.tailを使用することです:

from lxml.html import fromstring 
s = '<td class="some class"><br><br><br>foo<br><br>bar</td>' 
element = fromstring(s) 
print([e.tail or '' for e in element.xpath(".//br")]) 

これは、予想される出力を提供します

['', '', 'foo', '', 'bar'] 
+0

これは動作します、ありがとう! –

0
'//td[@class="some class"]//text()[preceding-sibling::br]' 
2
from lxml import etree 

html = ''' 
<td class='some class'> 
    <br> 
    <br> 
    <br>foo 
    <br> 
    <br>bar 
</td> 
''' 
r = etree.HTML(html) 
r.xpath('//td/text()') 

['\n ', '\n ', '\n ', 'foo\n ', '\n ', 'bar\n'] 

それは改行です、ホワイトスペースではありません。

+1

お返事ありがとうございます!私はちょうどそこに改行があってはならないことに気付きました(そして私の質問を編集しました)ので、実際には文字列には連続した改行があります。この場合、コードは機能しないようです。 –

関連する問題