通过lxml的属性查找元素

我需要parsing一个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> 

在这里我只想得到types为“新闻”的文章。 什么是最有效和优雅的方式来做到这一点与lxml?

我尝试了查找方法,但它不是很好:

 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 

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

这个xpathexpression式将返回所有具有值为“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" – 等等。

仅供参考,您可以通过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