17

xpath 経由でいくつかの html を破棄し、それを etree に変換しました。これに似たもの:

<td> text1 <a> link </a> text2 </td>

しかし、element.text を呼び出すと、text1 しか取得できません (そこにある必要があります。FireBug でクエリを確認すると、要素のテキストが強調表示され、埋め込まれたアンカー要素の前後の両方のテキストが表示されます...

4

8 に答える 8

18

使用するelement.xpath("string()")、ドキュメントlxml.etree.tostring(element, method="text")を参照してください。

于 2011-01-23T01:56:33.650 に答える
10

私と同じくらい怠け者かもしれない人々への公共サービスとして。実行できる上記のコードを次に示します。

from lxml import etree

def get_text1(node):
    result = node.text or ""
    for child in node:
        if child.tail is not None:
            result += child.tail
    return result

def get_text2(node):
    return ((node.text or '') +
            ''.join(map(get_text2, node)) +
            (node.tail or ''))

def get_text3(node):
    return (node.text or "") + "".join(
        [etree.tostring(child) for child in node.iterchildren()])


root = etree.fromstring(u"<td> text1 <a> link </a> text2 </td>")

print root.xpath("text()")
print get_text1(root)
print get_text2(root)
print root.xpath("string()")
print etree.tostring(root, method = "text")
print etree.tostring(root, method = "xml")
print get_text3(root)

出力は次のとおりです。

snowy:rpg$ python test.py 
[' text1 ', ' text2 ']
 text1  text2 
 text1  link  text2 
 text1  link  text2 
 text1  link  text2 
<td> text1 <a> link </a> text2 </td>
 text1 <a> link </a> text2 
于 2013-10-06T13:19:49.660 に答える
7

私にはlxmlのバグのように見えますが、ドキュメントを読むと設計に従っています。私はこのように解決しました:

def node_text(node):
    if node.text:
        result = node.text
    else:
        result = ''
    for child in node:
        if child.tail is not None:
            result += child.tail
    return result
于 2011-09-21T13:09:35.767 に答える
6

要素からテキストを取得するためにうまく機能しているように見えるもう1つのことは、"".join(element.itertext())

于 2014-04-06T08:04:48.307 に答える
3
<td> text1 <a> link </a> text2 </td>

これがその方法です(空白を無視して):

td.text == 'text1'
a.text == 'link'
a.tail == 'text2'

子要素内にあるテキストが必要ない場合は、それらの末尾のみを収集できます。

text = td.text + ''.join([el.tail for el in td])
于 2013-12-08T00:49:46.840 に答える
1
def get_text_recursive(node):
    return (node.text or '') + ''.join(map(get_text_recursive, node)) + (node.tail or '')
于 2012-01-26T03:26:46.017 に答える