1

今日、同じ問題に関する質問を投稿しましたが、その解決策はライブラリを切り替えることであり、他のライブラリに問題があるため、別の質問を開くと思います...それでいいと思います.

したがって、次のマークアップと一致させたくありません。

<text link="no">
    ...
</text>

テキストの中に何があるかは気にしません。そのテキストにはそのリンク属性があります。

私は今、次のようにpyparsingを使用しています:

def content_must_not_be_empty_string(tokens):
    if tokens[0]=="":
        raise ParseException("content cannot be empty")

text_start = Regex('<text[^<]*>')
text_no_start = Regex('<text[^<]*link="no"[^<]*>')
text_no_end = Regex('</text>[ \t\n\r\xa0]*')
text_no_content = SkipTo(text_no_start | text_no_end | text_start)
text_no_content.setParseAction(content_must_not_be_empty_string)
text_no = nestedExpr(text_no_start,text_no_end,text_no_content)
text_no.setParseAction(somemethod)

最初は空のトークンが原因ですべてがループしたため、content_must_not_be_empty を追加しました。

今はもうループしませんが、何らかのメソッドも実行されません。

助けていただければ幸いです。

4

2 に答える 2

2

厳密に言えば、pyparsing は XML 解析ライブラリではありませんが、XML および HTML からデータを抽出するためのサポートが組み込まれており、ドキュメント全体を解析することはできません。また、正規表現を Regex 要素内に埋め込むことができるという意味ではありません。代わりに、makeXMLTags または makeHTMLTags の使用を検討してください。

>>> sample = """<text link="no"> lskdjflskdjf </text>"""
>>> text_start,text_end = makeXMLTags("text")
>>> text_start_no = text_start.copy().setParseAction(withAttribute(link="no"))
>>> expr1 = text_start_no + SkipTo(text_end)('body') + text_end
>>> print expr1.parseString(sample)
['text', ['link', 'no'], False, 'lskdjflskdjf ', '</text>']
>>> print expr1.parseString(sample).dump()
['text', ['link', 'no'], False, 'lskdjflskdjf ', '</text>']
- body: lskdjflskdjf 
- empty: False
- endText: </text>
- link: no
- startText: ['text', ['link', 'no'], False]
  - empty: False
  - link: no

これにより、XML や HTML からデータを抽出する際のあらゆる種類の予期せぬ事態を回避できます。

実際にネストされたタグがある場合は、nestedExpr 領域を掘り下げる必要があります。

>>> sample2 = """<text link="no"> lskdjflskdjf<text>more</text> </text>"""

ただし、Regex で偽装するのではなく、makeXMLTags または makeHTMLTags を使用してタグ構造を作成することをお勧めします。

于 2013-01-09T13:47:32.800 に答える
0

これが私の現在作業中のコードです:

def content_must_not_be_empty_string(tokens):
    if tokens[0]=="":
        raise ParseException("content cannot be empty")

text_no_start = Regex('<text[^<]*link="no"[^<]*>')
text_no_end = Regex('</text>[ \t\n\r\xa0]*')
text_no_content = SkipTo(text_no_start | text_no_end)
text_no_content.setParseAction(content_must_not_be_empty_string)
text_no = originalTextFor(nestedExpr(text_no_start,text_no_end,text_no_content), asString="False")
text_no.setParseAction(somemethod)
于 2013-01-09T14:28:19.380 に答える