-1

私はこの問題を盲目的に見つめてきました。

XML でカプセル化された HTML データを Atlassian Confluence にフィードしています。-tags の場合、span-tag を追加する必要があります。しかし、どのように試しても、lxml-lib は < と > をそれぞれ < と > に変換します。ただし、変換は新しいタグのみを対象としており、 内の既存のタグはそのままの状態で取得されます。

この Python コードを見てください。

for x in doc.iter():
    if x.tag == "td":
        print x.text
        x.text = "no tags"
        print etree.dump(x)
        x.text = "<span>one tag</span>"
        print etree.dump(x)

この入力の場合:

<tr>
  <td>apa</td>
  <td>1.2</td>
  <td>
    <a href="http://korv.com/apa.tar.gz">3.4</a>
  </td>
  <td>no</td>
</tr>
<tr>
  <td>coreutils</td>
  <td>6.12</td>
  <td>
    <a href="http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz">8.21</a>
  </td>
  <td>no</td>
</tr>

これは出力です:

<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
1.2
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
None
<td>no tags<a href="http://korv.com/apa.tar.gz">3.4</a></td>None
<td>&lt;span&gt;one tag&lt;/span&gt;<a href="http://korv.com/apa.tar.gz">3.4</a></td>None
no
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
coreutils
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
6.12
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None
None
<td>no tags<a href="http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz">8.21</a></td>None
<td>&lt;span&gt;one tag&lt;/span&gt;<a href="http://ftp.gnu.org/gnu/coreutils/coreutils-8.21.tar.xz">8.21</a></td>None
no
<td>no tags</td>None
<td>&lt;span&gt;one tag&lt;/span&gt;</td>None

ご覧のとおり、 my が変換されている間、タグ内は変更されていません。このエラーを把握できません。

既存のテキストは変更されていないのに、テキストの変換が行われるのはなぜですか?

4

2 に答える 2

5

テキストを XML 要素に挿入しています。テキストは常に XML セーフになるようにエスケープされます。

新しいタグを追加したい場合は、新しいElement; ElementTree.SubElement()工場は最も簡単です:

from lxml import etree

etree.SubElement(td, 'span').text = 'one tag'

のコンテンツをラップしたい場合はtd、すべての要素 (および.text属性:

def wrap(parent, tagname, **kw):
    sub = etree.SubElement(parent, tagname, **kw)
    parent.text, sub.text = None, parent.text
    for index, child in enumerate(parent.iterchildren()):
        if child is not sub:
            sub.insert(index, child)
    return parent

wrap(td, 'span')

デモ:

>>> etree.tostring(doc.findall('.//td')[2])
'<td>\n    <a href="http://korv.com/apa.tar.gz">3.4</a>\n  </td>\n  '
>>> etree.tostring(wrap(tree.findall('.//td')[2], 'span'))
'<td><span>\n    <a href="http://korv.com/apa.tar.gz">3.4</a>\n  </span></td>\n  '
于 2013-07-08T10:00:59.790 に答える
1

あなたが書くとき

x.text = "<span>one tag</span>"

ノードのコンテンツがそのテキストであると言っています。<とは XML の予約文字であるため>、エスケープする必要があります。

新しい<span>ノードを作成しようとしているようです。そのためには、ノードを作成する必要があります。

于 2013-07-08T10:01:09.787 に答える