python:lxml带冒号的xpath标记名
我必须解析一些提要,但其中一个元素(标记)带有python:lxml带冒号的xpath标记名,python,tags,lxml,colon,Python,Tags,Lxml,Colon,我必须解析一些提要,但其中一个元素(标记)带有colonleemore23 如何使用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
colon
leemore23
如何使用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()
或
所以不需要更换
你能给我什么建议?前缀
dc:
表示一个。使用来处理它,而不仅仅是从输入中删除它。碰巧,dc
通常指
您需要确定完整的命名空间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
属性:
{'dc': 'http://purl.org/dc/elements/1.1/'}
因此,您可以将代码更改为:
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:
前缀表示。使用来处理它,而不仅仅是从输入中删除它。碰巧,dc
通常指
您需要确定完整的命名空间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
属性:
{'dc': 'http://purl.org/dc/elements/1.1/'}
因此,您可以将代码更改为:
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:
表示名称空间。使用lxml
的xpath
方法时,请使用来搜索命名空间中的元素
因此,在您的例子中,使用@MartijnPieters提供的都柏林核心前缀
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()
dc:
表示名称空间。使用lxml
的xpath
方法时,请使用来搜索命名空间中的元素
因此,在您的例子中,使用@MartijnPieters提供的都柏林核心前缀
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()
很好用,非常感谢!但是有一个问题,标签(dc:creator)有cdata文本,它没有被解析。。如果有简单的文本,一切都可以,但cdata不起作用。它起作用了,非常感谢!但是有一个问题,标签(dc:creator)有cdata文本,它没有被解析。。如果有简单的文本,一切都可以,但cdata不起作用..我怀疑你需要看看,避免重新发明轮子。我怀疑你需要看看,避免重新发明轮子。它可以使用名称空间,但有一个问题。标记(dc:creator)具有cdata文本,未对其进行分析。。如果有简单的文本,一切都可以,但使用cdata则不起作用。有什么想法吗?@yital9:你是如何访问标签的文本内容的?LXML通常在使用普通API时删除CDATA“包装器”。如果存在简单文本(不带CDATA)article_node.xpath('.//dc:creator',namespaces=dc)[0]。text.strip()返回文本,但如果存在CDATA article_node.xpath('.//dc:creator',namespaces=dc)返回[]和article_node.xpath('.//dc:creator',namespaces=dc)[0]。text.strip()引发异常。@yital9:您能给我们一些示例输入吗?当然,这里:是用名称空间解析的好,但不是..它用名称空间工作,但有一个问题。标记(dc:creator)具有cdata文本,未对其进行分析。。如果有简单的文本,一切都可以,但使用cdata则不起作用。有什么想法吗?@yital9:你是如何访问标签的文本内容的?LXML通常在使用普通API时删除CDATA“包装器”。如果存在简单文本(不带CDATA)article_node.xpath('.//dc:creator',namespaces=dc)[0]。text.strip()返回文本,但如果存在CDATA article_node.xpath('.//dc:creator',namespaces=dc)返回[]和article_node.xpath('.//dc:creator',namespaces=dc)[0]。text.strip()引发异常。@yital9:您能给我们一些示例输入吗?当然,这里:是用名称空间解析的,可以,但不是。。