2

私はXML(実際にはXMLスタイルシート)を持っています。Pythonでは、すべてのタグを削除し、タグ間のテキストのみを保持したいと思います。

これに対する最も簡単な解決策は何ですか?私はここで同様の質問を見ました: ダウンロードされたページからすべてのhtmlタグを削除する方法

しかし、何らかの理由で、これはこの場合は機能しないようです。タグ内の引用符で区切られたテキストを保持したくないことに注意してください。「<」で始まり、「>」で終わるすべてのものを本当に削除したいと思います。

4

3 に答える 3

3

使用できます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)
于 2012-12-23T12:42:23.473 に答える
0

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」を使用してください。

于 2012-12-23T12:35:40.950 に答える
0

ElementTreeAPI (またはより高速な同等の 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'
于 2012-12-23T12:17:57.193 に答える