4

lxml / ElementTreeを使用して「text2」を選択する必要があるこの種のHTMLがあるとします。

<div>text1<span>childtext1</span>text2<span>childtext2</span>text3</div>

既に div 要素を mydiv として持っている場合、mydiv.text は "text1" だけを返します。

itertext() の使用は、ツリー全体を div の下で処理するため、問題があるか、せいぜい面倒に思えます。

要素から最初以外のテキスト チャンクを抽出する簡単でエレガントな方法はありますか?

4

4 に答える 4

13

さて、lxml.etree は完全な XPath サポートを提供します。これにより、テキスト項目に対処できます。

>>> import lxml.etree
>>> fragment = '<div>text1<span>childtext1</span>text2<span>childtext2</span>text3</div>'
>>> div = lxml.etree.fromstring(fragment)
>>> div.xpath('./text()')
['text1', 'text2', 'text3']
于 2010-09-23T21:45:30.860 に答える
6

そのようなテキストはtail、要素の子の属性になります。あなたの要素があったelem場合:

elem[0].tail

要素内の最初の子の末尾のテキストが表示されます。あなたの場合は、"text2"探しているものです。

于 2010-09-10T10:58:06.540 に答える
4

textllasramが言ったように、属性にないテキストはすべてtail子ノードの属性になります。

例として、ノード内のすべてのテキストチャンク(最初およびそれ以外)を抽出する最も簡単な方法は次のとおりです。

html = '<div>text1<span>childtext1</span>text2<span>childtext2</span>text3</div>'

import lxml.html    # ...or lxml.etree as appropriate
div = lxml.html.fromstring(html)

texts = [div.text] + [child.tail for child in div]
# Result: texts == ['text1', 'text2', 'text3']
# ...and you are guaranteed that div[x].tail == texts[x+1]
# (which can be useful if you need to access or modify the DOM)

空の文字列が含まれる可能性を防ぐためにその関係を犠牲にしたい場合はtexts、代わりにこれを使用できます。

texts = [div.text] + [child.tail for child in div if child.tail]

私はこれを単純な古いstdlibElementTreeでテストしていませんが、それでも機能するはずです。(Shane Hollowayのlxml固有のソリューションを見たときに初めて発生したこと)HTMLのイデオシンクロシーのサポートが向上し、通常はLXMLがすでにインストールされているため、LXMLの方が好きです。lxml.html.clean

于 2010-09-19T19:37:51.317 に答える
1

node.text_content()ノードの下にあるすべてのテキストを単一の文字列として取得するために使用します。

于 2012-10-30T07:39:30.633 に答える