この Ruby/hpricot の例のように、Python を使用して、XML ドキュメントのすべてのテキスト コンテンツを単一の文字列として取得するにはどうすればよいですか。
XML タグを 1 つの空白に置き換えたいと考えています。
この Ruby/hpricot の例のように、Python を使用して、XML ドキュメントのすべてのテキスト コンテンツを単一の文字列として取得するにはどうすればよいですか。
XML タグを 1 つの空白に置き換えたいと考えています。
私は BeautifulSoup が本当に好きで、できれば HTML で正規表現を使用したくありません。
から適応: [この StackOverflow アンサー]、[BeautifulSoup ドキュメント]
from bs4 import BeautifulSoup
soup = BeautifulSoup(txt) # txt is simply the a string with your XML file
pageText = soup.findAll(text=True)
print ' '.join(pageText)
もちろん、BeautifulSoup を使用して、探しているページをナビゲートすることもできます (使用する必要があります)。
このまさに問題は、実際には lxml チュートリアルの例であり、次の XPath 式のいずれかを使用して、ドキュメントからテキスト コンテンツのすべてのビットを文字列のリストとして取得することを提案しています。
root.xpath("string()")
root.xpath("//text()")
次に、これらのテキストのビットを 1 つの大きな文字列に結合する必要があります。str.join
おそらく を使用str.strip
して、各ビットの先頭と末尾の空白を取り除き、完全に空白でできているビットを無視します。
>>> from lxml import etree
>>> root = etree.fromstring("""
... <node>
... some text
... <inner_node someattr="someval"> </inner_node>
... <inner_node>
... foo bar
... </inner_node>
... yet more text
... <inner_node />
... even more text
... </node>
... """)
>>> bits_of_text = root.xpath('//text()')
>>> print(bits_of_text) # Note that some bits are whitespace-only
['\n some text\n ', ' ', '\n ', '\n foo bar\n ', '\n yet more text\n ', '\n even more text\n']
>>> joined_text = ' '.join(
... bit.strip() for bit in bits_of_text
... if bit.strip() != ''
... )
>>> print(joined_text)
some text foo bar yet more text even more text
ところで、テキストのビット間にスペースを挿入したくない場合は、単に行うことができることに注意してください
etree.tostring(root, method='text', encoding='unicode')
また、 XMLの代わりにHTMLを扱っていて、 HTML の解析にを使用している場合は、ルート ノードのメソッドを呼び出すだけで、そこに含まれるすべてのテキストを取得できます (ただし、スペースは挿入されません)。lxml.html
.text_content()
>>> import lxml.html
>>> root = lxml.html.document_fromstring('<p>stuff<p>more <br><b>stuff</b>bla')
>>> root.text_content()
'stuffmore stuffbla'
編集:これは、1スペースのインデントが正常であると思ったときに投稿された回答であり、コメントに記載されているように、それは良い回答ではありません. より良い解決策については、他の人をチェックしてください。これは単にアーカイブ上の理由からここに残されています。フォローしないでください。
あなたはlxmlを求めました:
reslist = list(root.iter())
result = ' '.join([element.text for element in reslist])
または:
result = ''
for element in root.iter():
result += element.text + ' '
result = result[:-1] # Remove trailing space