选择与python lxml匹配的节点

时间:2013-10-03 13:35:20

标签: python python-2.7 xpath xslt-1.0 lxml

我在下面有以下XML示例:

                    <a:p>
                        <a:r>
                            <a:rPr lang="en-US" dirty="0"/>
                            <a:t>Go for a </a:t>
                        </a:r>
                        <a:r>
                            <a:rPr lang="en-US" dirty="0" smtClean="0"/>
                            <a:t>test-drive</a:t>
                        </a:r>
                        <a:r>
                            <a:rPr lang="de-DE" dirty="0" smtClean="0">
                                <a:hlinkClick r:id="rId11"/>
                            </a:rPr>
                            <a:t>http</a:t>
                        </a:r>
                        <a:r>
                            <a:rPr lang="de-DE" dirty="0">
                                <a:hlinkClick r:id="rId11"/>
                            </a:rPr>
                            <a:t>://</a:t>
                        </a:r>
                        <a:r>
                            <a:rPr lang="de-DE" dirty="0" smtClean="0">
                                <a:hlinkClick r:id="rId11"/>
                            </a:rPr>
                            <a:t>google.com</a:t>
                        </a:r>
                        <a:r>
                            <a:rPr lang="de-DE" dirty="0" smtClean="0"/>
                            <a:t>.</a:t>
                        </a:r>
                    </a:p>

我必须遍历所有a:r个节点,并从没有子节点text的节点中获取a:hlinkClick。例如,输出应该如下所示:

Go for a test drive .

链接必须是exculded。我在python中完成了以下操作以仅获取link

if d.xpath('./a:r/a:rPr[@dirty="0"]/a:hlinkClick[@r:id]',  namespaces=NAMESPACES) != []:
    e = d.xpath('./a:r/a:rPr/a:hlinkClick/../../a:t/text()',  namespaces=NAMESPACES)
    print ''.join(e)

但现在我想知道如何才能继续获取文本。任何建议,将不胜感激。感谢

2 个答案:

答案 0 :(得分:1)

怎么样?
>>> import re
>>> telems = d.xpath('.//a:r[not(.//a:hlinkClick)]//a:t/text()', namespaces=NAMESPACES)
>>> joined_text = ''.join(telems).strip()
>>> re.sub('\s+', ' ', joined_text)
'Go for a test-drive.'

答案 1 :(得分:0)

如果您有一个xmlObject,您可以迭代该对象并为每个标记获取它的文本和属性。

我正在使用Element Tree,请参阅python文档here