使用lxml按属性查找元素

时间:2011-02-23 15:29:23

标签: python attributes find lxml

我需要解析一个xml文件来提取一些数据。 我只需要一些具有某些属性的元素,这是一个文档示例:

<root>
    <articles>
        <article type="news">
             <content>some text</content>
        </article>
        <article type="info">
             <content>some text</content>
        </article>
        <article type="news">
             <content>some text</content>
        </article>
    </articles>
</root>

这里我只想获得“新闻”类型的文章。 用lxml做最有效和最优雅的方法是什么?

我尝试使用find方法,但它不是很好:

from lxml import etree
f = etree.parse("myfile")
root = f.getroot()
articles = root.getchildren()[0]
article_list = articles.findall('article')
for article in article_list:
    if "type" in article.keys():
        if article.attrib['type'] == 'news':
            content = article.find('content')
            content = content.text

2 个答案:

答案 0 :(得分:71)

您可以使用xpath,例如root.xpath("//article[@type='news']")

此xpath表达式将返回具有值“news”的“type”属性的所有<article/>元素的列表。然后,您可以迭代它以执行您想要的操作,或者将其传递到任何地方。

要获得文本内容,您可以像这样扩展xpath:

root = etree.fromstring("""
<root>
    <articles>
        <article type="news">
             <content>some text</content>
        </article>
        <article type="info">
             <content>some text</content>
        </article>
        <article type="news">
             <content>some text</content>
        </article>
    </articles>
</root>
""")

print root.xpath("//article[@type='news']/content/text()")

,这将输出['some text', 'some text']。或者,如果您只想要内容元素,那么它将是"//article[@type='news']/content" - 依此类推。

答案 1 :(得分:9)

仅供参考,您可以使用findall获得相同的结果:

root = etree.fromstring("""
<root>
    <articles>
        <article type="news">
             <content>some text</content>
        </article>
        <article type="info">
             <content>some text</content>
        </article>
        <article type="news">
             <content>some text</content>
        </article>
    </articles>
</root>
""")

articles = root.find("articles")
article_list = articles.findall("article[@type='news']/content")
for a in article_list:
    print a.text