python:带冒号的lxml xpath标记名

2024-10-01 15:38:37 发布

您现在位置:Python中文网/ 问答频道 /正文

我必须解析一些提要,但是其中一个元素(标记)是带有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()

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

^{pr2}$

或者

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

所以没有替换

你能给我什么建议?在


Tags: text标记nodetree元素datafooarticle
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属性确定URL;根元素可能具有以下.nsmap属性:

^{pr2}$

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

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

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

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

dc:表示命名空间。使用lxmlxpath方法时,使用^{} parameter搜索命名空间中的元素。在

所以,在你的例子中,使用@MartijnPieters提供的dublin core前缀

r = requests.get('http://www.site.com/feed/')
tree = lxml.etree.fromstring(r.content)
ns = {'dc':'http://purl.org/dc/elements/1.1/'}
for article_node in tree.xpath('//item'):
    data['dc'] = article_node.xpath('.//dc:creator', namespaces = ns)[0].text.strip()

相关问题 更多 >

    热门问题