1. ホーム
  2. python

[解決済み] lxml のタグの中のすべてのテキストを取得する

2023-05-08 05:06:46

質問

の中のテキストをすべて取得するコードスニペットを書きたいと思います。 <content> タグ内のすべてのテキストを取得するコードスニペットを書きたいのですが、以下の 3 つのインスタンスすべてにおいて、コードタグを含めて lxml で記述します。試しに tostring(getchildren()) を試しましたが、これではタグの間のテキストが欠落してしまいます。APIで関連する関数を検索しても、あまりヒットしませんでした。あなたは私を助けることができますか?

<!--1-->
<content>
<div>Text inside tag</div>
</content>
#should return "<div>Text inside tag</div>

<!--2-->
<content>
Text with no tag
</content>
#should return "Text with no tag"


<!--3-->
<content>
Text outside tag <div>Text inside tag</div>
</content>
#should return "Text outside tag <div>Text inside tag</div>"

どのように解決するのですか?

試してみてください。

def stringify_children(node):
    from lxml.etree import tostring
    from itertools import chain
    parts = ([node.text] +
            list(chain(*([c.text, tostring(c), c.tail] for c in node.getchildren()))) +
            [node.tail])
    # filter removes possible Nones in texts and tails
    return ''.join(filter(None, parts))

from lxml import etree
node = etree.fromstring("""<content>
Text outside tag <div>Text <em>inside</em> tag</div>
</content>""")
stringify_children(node)

を生成する。 '\nText outside tag <div>Text <em>inside</em> tag</div>\n'