私はXML(実際にはXMLスタイルシート)を持っています。Pythonでは、すべてのタグを削除し、タグ間のテキストのみを保持したいと思います。
これに対する最も簡単な解決策は何ですか?私はここで同様の質問を見ました: ダウンロードされたページからすべてのhtmlタグを削除する方法
しかし、何らかの理由で、これはこの場合は機能しないようです。タグ内の引用符で区切られたテキストを保持したくないことに注意してください。「<」で始まり、「>」で終わるすべてのものを本当に削除したいと思います。
私はXML(実際にはXMLスタイルシート)を持っています。Pythonでは、すべてのタグを削除し、タグ間のテキストのみを保持したいと思います。
これに対する最も簡単な解決策は何ですか?私はここで同様の質問を見ました: ダウンロードされたページからすべてのhtmlタグを削除する方法
しかし、何らかの理由で、これはこの場合は機能しないようです。タグ内の引用符で区切られたテキストを保持したくないことに注意してください。「<」で始まり、「>」で終わるすべてのものを本当に削除したいと思います。
使用できますxml.parsers.expat
:
from xml.parsers.expat import ParserCreate
def char_data(data):
if data.strip(): # skip empty text if you want
print data
parser = ParserCreate()
parser.CharacterDataHandler = char_data
parser.Parse(doc,True)
またはxml.sax
:
from xml.sax import make_parser, handler
class extract_text(handler.ContentHandler):
def characters(self,data):
if data.strip():
print data
parser = make_parser()
parser.setContentHandler(extract_text())
parser.feed(doc)
整形式の XML でない場合は、次のことも試してくださいHTMLParser
。
from HTMLParser import HTMLParser
class extract_text(HTMLParser):
def handle_data(self,data):
if data.strip():
print data
parser = extract_text()
parser.feed(doc)
Lxmlには問題がある可能性があり、MartijnPietersが標準ライブラリにあるElementTreeまたはCバージョンのcElementTreeで言ったとおりのことを行うことができます。
>>> from xml.etree import ElementTree
>>> doc='''
... <?xml-stylesheet href="common.css"?>
... <?xml-stylesheet href="modern.css"
... title="Modern" media="screen"
... type="text/css"?>
... <?xml-stylesheet href="classic.css"
... alternate="yes" title="Classic"
... media="screen, print" type="text/css"?>
... <ARTICLE>
... <HEADLINE>Fredrick the Great meets
... Bach</HEADLINE>
... <AUTHOR>Johann Nikolaus Forkel</AUTHOR>
... <PARA>
... One evening, just as he was
... getting his
... <INSTRUMENT>flute</INSTRUMENT>
... ready and his musicians were
... assembled, an officer brought him a
... list of the strangers who had arrived.
... </PARA>
... </ARTICLE>
... '''
>>> xml = ElementTree.fromstring(doc)
>>> xml
<Element 'ARTICLE' at 0x9295e6c>
>>> ElementTree.tostring(xml,method='text')
'\n Fredrick the Great meets\n Bach\n Johann Nikolaus Forkel\n \n One evening, just as he was\n getting his\n flute\n ready and his musicians were\n assembled, an officer brought him a\n li
st of the strangers who had arrived.\n \n '
cElementTreeの方が高速で、標準ライブラリにありますが、UTF8に問題があると思うので、utf8が必要な場合は「ElementTree」を使用してください。
ElementTree
API (またはより高速な同等の API )lxml
を使用し、etree.totext(tree, method='text')
関数を使用してツリーをシリアライズしてテキスト コンテンツだけに戻します。
>>> from xml.etree import ElementTree as ET
>>> doc='''\
... <?xml-stylesheet href="common.css"?>
... <?xml-stylesheet href="modern.css"
... title="Modern" media="screen"
... type="text/css"?>
... <?xml-stylesheet href="classic.css"
... alternate="yes" title="Classic"
... media="screen, print" type="text/css"?>
... <ARTICLE>
... <HEADLINE>Fredrick the Great meets
... Bach</HEADLINE>
... <AUTHOR>Johann Nikolaus Forkel</AUTHOR>
... <PARA>
... One evening, just as he was
... getting his
... <INSTRUMENT>flute</INSTRUMENT>
... ready and his musicians were
... assembled, an officer brought him a
... list of the strangers who had arrived.
... </PARA>
... </ARTICLE>
... '''
>>> tree = ET.fromstring(doc)
>>> ET.tostring(tree, method='text')
'\n Fredrick the Great meets\n Bach\n Johann Nikolaus Forkel\n \n One evening, just as he was\n getting his\n flute\n ready and his musicians were\n assembled, an officer brought him a\n list of the strangers who had arrived.\n \n'