0

私のXMLファイルは次のようになります。

 <strings>
      <string>Bla <b>One &amp; Two</b> Foo</string>
 </strings>

内部タグを維持しながら、各<string>のコンテンツを抽出したいと思います。つまり、次のPython文字列を表示したいと思います:u "Bla <b> One&Two </b>Foo"。あるいは、u "Bla <b> One&Two </ b> Foo"に落ち着いて、自分でエンティティを置き換えようとすることもできると思います。

私は現在lxmlを使用しています。これにより、ネストされたタグを反復処理したり、タグ内にないテキストを欠落させたり、あるいはすべてのテキストコンテンツ(itertext)を反復処理して、タグ情報を失ったりすることができます。私はおそらく何かが欠けています。

可能であればlxmlを保持したいのですが、必要に応じて別のライブラリに切り替えることができます。

4

4 に答える 4

3

関数によって返されるオブジェクトを条件付きで処理するより良い方法があるかもしれませんが、それが何であるかをxpath()十分lxmlに理解していないため、ノードのテキスト値を返す関数を作成する必要がありました。とはいえ、これは問題への一般的なアプローチを示しています。

>>> from lxml import etree
>>> from StringIO import StringIO
>>> def node_text(n):
        try:
            return etree.tostring(n, method='html', with_tail=False)
        except TypeError:
            return str(n)

>>> f = StringIO('<strings><string>This is <b>not</b> how I plan to escape.</string></strings>')
>>> x = etree.parse(f)
>>> ''.join(node_text(n) for n in x.xpath('/strings/string/node()'))
'This is <b>not</b> how I plan to escape.'
于 2009-11-29T18:28:44.763 に答える
2

etree.tostringを試してください

outer = etree.tostring(string_elem, method='html')
inner = re.match("^[^>]+>(.*)<[^<]+$", outer).groups(1)[0]
于 2009-11-29T07:42:09.773 に答える
0

言語に関係なく、比較的単純なXSLTテンプレートでうまくいきます。

保持したいタグにパターンを定義したり、他のテキストに変換したりするようなものです。

もちろん、準拠したDOM実装で再帰関数を使用して(おそらく最小限ですか?)、タグを手動で処理することもできます。

(擬似コード)

def Function(tag):
   if tag.NodeType = "#text": return tag.innerText
   text=""
   if tag.ElementName in allowedTags:
       text="<%s>"%tag.ElementName
   text += [Function(subtag) for subtag in tag.childs]
   if tag.ElementName in allowedTags:
       text+="</%s>"%tag.ElementName
   return text
于 2009-11-29T08:04:38.520 に答える
-1

パーサーを使用せず、純粋な文字列操作のみ

mystring="""
 <strings>
      <string>Bla <b>One &amp; Two</b> Foo</string>
 </strings>
"""
for s in mystring.split("</string>"):
    if "<string>" in s:
        i = s.index("<string>")
        print s[i+len("<string>"):].replace("&amp;","")
于 2009-11-29T08:39:39.667 に答える