Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python:lxml带冒号的xpath标记名_Python_Tags_Lxml_Colon - Fatal编程技术网

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:您能给我们一些示例输入吗?当然,这里:是用名称空间解析的,可以,但不是。。