python:带冒号的lxml xpath标记名称

时间:2012-11-20 11:04:56

标签: python tags lxml colon

我必须解析一些Feed,但其中一个元素(标记)与colon <dc:creator>leemore23</dc:creator>

我如何使用lxml解析它?所以我这样做了

r = requests.get('http://www.site.com/feed/')
foo = (r.content).replace("dc:creator","dc")
tree = lxml.etree.fromstring(foo)
for article_node in tree.xpath('//item'):
    data['dc'] = article_node.xpath('.//dc')[0].text.strip()

但我认为有更好的方法,比如

data['dc'] = article_node.xpath('.//dc:creator')[0].text.strip()

data['dc'] = article_node.xpath('.//dc|creator')[0].text.strip()

所以不用替换

你能给我什么建议吗?

2 个答案:

答案 0 :(得分:2)

dc:前缀表示XML namespace。使用elementtree API namespace support来处理它,而不仅仅是从输入中删除它。碰巧,dc通常是指Dublin Core metadata

您需要确定完整的命名空间URL,然后在XPath查询中使用该URL:

DCNS = 'http://purl.org/dc/elements/1.1/'
creator = article_node.xpath('.//{{{0}}}creator'.format(DCNS))

这里我使用推荐的http://purl.org/dc/elements/1.1/命名空间URL作为都柏林核心前缀。

您通常可以从.nsmap属性确定网址;您的根元素可能具有以下.nsmap属性:

{'dc': 'http://purl.org/dc/elements/1.1/'}

因此您可以将代码更改为:

creator = article_node.xpath('.//{{{0}}}creator'.format(article_node.nsmap['dc']))

通过将nsmap字典作为xpath()关键字传递给namespaces方法,可以进一步简化这一点,此时您可以在xpath表达式中使用前缀:

creator = article_node.xpath('.//dc:creator', namespaces=article_node.nsmap)

答案 1 :(得分:1)

dc:表示命名空间。使用lxml的{​​{1}}方法时,请使用namespaces parameter搜索命名空间中的元素。

所以,在你的情况下,使用@MartijnPieters提供的都柏林核心前缀,

xpath