【问题标题】:Choose nodes that matches python lxml选择与 python lxml 匹配的节点
【发布时间】:2013-10-03 13:35:20
【问题描述】:

我有以下 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 节点并从没有子节点a:hlinkClick 的节点中获取text。例如,输出应如下所示:

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)

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

【问题讨论】:

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


    【解决方案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.'
    

    【讨论】:

      【解决方案2】:

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

      我用的是元素树,请看python文档here

      【讨论】:

        猜你喜欢
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        • 2015-07-09
        • 2020-07-23
        • 2023-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多