0

xmlファイルを解析しようとしていました。私の問題はこれと同じです:

PythonElementTreeを使用して不明な要素のxmlファイルを解析する

そして、untubuの解決策を試しました。

それは素晴らしい働きをします。ただし、単一のタグを持つ行のみ

例えば:

   <some_root_name>
<tag_x>bubbles</tag_x>
 </some_root_name>

これはうまく機能しますが、次のような場合:

src = '''\
<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link>
'''

それは失敗します..私はこのような多くのインスタンスを持っています。ネイティブライブラリの使用法を超えたくないのは、この後、別のコンピューター(prod env)でコードを実行し、そこにライブラリを設定する必要があるためです。

方法はありますか、これを解決するために元のソリューションを変更できます。ありがとう。

上記のリンクからのコード:

import xml.sax as sax
import xml.sax.handler as saxhandler
import pprint

class TagParser(saxhandler.ContentHandler):
    # http://docs.python.org/library/xml.sax.handler.html#contenthandler-objects
    def __init__(self):
        self.tags = {}
    def startElement(self, name, attrs):
        self.tag = name
    def endElement(self, name):
        if self.tag:
            self.tags[self.tag] = self.data
            self.tag = None
            self.data = None
    def characters(self, content):
        self.data = content

parser = TagParser()
src = '''\
<some_root_name>
    <tag_x>bubbles</tag_x>
    <tag_y>car</tag_y>
    <tag...>42</tag...>
</some_root_name>'''
sax.parseString(src, parser)
pprint.pprint(parser.tags)

例外トレース:

File "extract_xml.py", line 59, in unittest
  sax.parseString(src, parser)
File "C:\Python27\lib\xml\sax\__init__.py", line 49, in parseString
  parser.parse(inpsrc)
File "C:\Python27\lib\xml\sax\expatreader.py", line 107, in parse
  xmlreader.IncrementalParser.parse(self, source)
File "C:\Python27\lib\xml\sax\xmlreader.py", line 125, in parse
  self.close()
File "C:\Python27\lib\xml\sax\expatreader.py", line 217, in close
  self.feed("", isFinal = 1)
File "C:\Python27\lib\xml\sax\expatreader.py", line 211, in feed
  self._err_handler.fatalError(exc)
File "C:\Python27\lib\xml\sax\handler.py", line 38, in fatalError
  raise exception
xml.sax._exceptions.SAXParseException: <unknown>:2:4: no element found
4

2 に答える 2

2

にデータを追加するためにTagParser使用します。endElementself.tags

src等しい

src = '''\
<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link></review>
'''

には<review>終了タグがない</review>ため、endElement呼び出されることはありません。

</review>終了タグを追加する場合src

src = '''\
<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link></review>
'''

その後、プログラムは

{u'link': u'http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178'}
于 2012-12-06T21:28:18.457 に答える
1

あなたの質問が言っていることにもかかわらず、これは実際にはうまく機能します:

parser = TagParser()
src = '''\
<some_root_name>
    <tag_x>bubbles</tag_x>
    <tag_y>car</tag_y>
    <tag...>42</tag...>
</some_root_name>'''
sax.parseString(src, parser)
pprint.pprint(parser.tags)

parser.tags最終的には:

{u'tag...': u'42', u'tag_x': u'bubbles', u'tag_y': u'car'}

他の例は失敗しますが、それは有効なXMLではないためです。

src = '''<review type="review"><link>http://www.openlist.com/new-york-ny/mickey-mantles/27612417/?numReviews=178</link>'''
parser = TagParser()
sax.parseString(src, parser)
pprint.pprint(parser.tags)

タグがソースで閉じられることはreviewないため、これは有効なXMLフラグメントではないため、解析しようとすると例外が発生します。

有効なドキュメントから不完全なフラグメントを取り出していることが問題である場合は、それを行わないでください。reviewタグから1行を解析するのではなく、タグ全体を取得して解析します。

ソースデータが実際には有効なXMLではないことが問題である場合は、 BeautifulSoupのように壊れたXMLを処理するように設計されたパーサーを使用する必要があります。どちらElementTreexml.sax機能しません。

于 2012-12-06T21:31:17.973 に答える