我必须解析一些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()
所以不用替换
你能给我什么建议吗?答案 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