当前位置: 首页 > 面试题库 >

如何在lxml xpath查询中使用空名称空间?

百里京
2023-03-14
问题内容

我有以下格式的xml文档:

<feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:gsa="http://schemas.google.com/gsa/2007">
  ...
  <entry>
    <id>https://ip.ad.dr.ess:8000/feeds/diagnostics/smb://ip.ad.dr.ess/path/to/file</id>
    <updated>2011-11-07T21:32:39.795Z</updated>
    <app:edited xmlns:app="http://purl.org/atom/app#">2011-11-07T21:32:39.795Z</app:edited>
    <link rel="self" type="application/atom+xml" href="https://ip.ad.dr.ess:8000/feeds/diagnostics"/>
    <link rel="edit" type="application/atom+xml" href="https://ip.ad.dr.ess:8000/feeds/diagnostics"/>
    <gsa:content name="entryID">smb://ip.ad.dr.ess/path/to/directory</gsa:content>
    <gsa:content name="numCrawledURLs">7</gsa:content>
    <gsa:content name="numExcludedURLs">0</gsa:content>
    <gsa:content name="type">DirectoryContentData</gsa:content>
    <gsa:content name="numRetrievalErrors">0</gsa:content>
  </entry>
  <entry>
    ...
  </entry>
  ...
</feed>

我需要entry使用lxml中的xpath检索所有元素。我的问题是我不知道如何使用空的名称空间。我尝试了以下示例,但没有用。请指教。

import lxml.etree as et

tree=et.fromstring(xml)

我尝试过的各种方法是:

for node in tree.xpath('//entry'):

要么

namespaces = {None:"http://www.w3.org/2005/Atom" ,"openSearch":"http://a9.com/-/spec/opensearchrss/1.0/" ,"gsa":"http://schemas.google.com/gsa/2007"}

for node in tree.xpath('//entry', namespaces=ns):

要么

for node in tree.xpath('//\"{http://www.w3.org/2005/Atom}entry\"'):

在这一点上,我只是不知道该尝试什么。任何帮助是极大的赞赏。


问题答案:

这样的事情应该起作用:

import lxml.etree as et

ns = {"atom": "http://www.w3.org/2005/Atom"}
tree = et.fromstring(xml)
for node in tree.xpath('//atom:entry', namespaces=ns):
    print node

另请参见http://lxml.de/xpathxslt.html#namespaces-and-
prefixes

选择:

for node in tree.xpath("//*[local-name() = 'entry']"):
    print node


 类似资料:
  • 问题内容: 当我的XML看起来像这样(no )时,我可以使用XPath轻松查询它 但是当看起来像这样我就不能 有任何想法吗? 问题答案: 在第二个示例XML文件中,元素绑定到名称空间。你的XPath尝试处理绑定到默认“无名称空间”名称空间的元素,因此它们不匹配。 首选方法是使用名称空间前缀注册名称空间。它使你的XPath更加易于开发,读取和维护。 但是,并不一定要注册名称空间并在XPath中使用名

  • 问题内容: 我有,和(可选),我需要寻找。因此,我需要一个查询来为我提供所有设置了别名的名称。 仅在我可以做的情况下: 那么,什么等同于以上内容? 问题答案: 你可以这样做: 如果你需要排除空值和空字符串,则首选方法是将条件链接在一起,如下所示: 将这些方法链接在一起基本上可以独立地检查每个条件:在上面的示例中,我们排除了其中为 或空字符串的行,因此你将获得所有Name具有非空非空字段的对象。生成

  • 问题内容: 这两行之间的主要区别是什么: 和 当我使用第一行时,我得到一个错误:而且我不太确定为什么会收到此错误?第二行似乎已解决了该问题。 问题答案: 如果您使用: 这意味着ArrayObject是在当前名称空间中定义的。您可以在全局名称空间(当前作用域中未定义名称空间)中,或者在与当前作用域相同的名称空间中定义ArrayObject时,使用此语法(示例)。 如果您使用: 这意味着ArrayOb

  • 问题内容: 我要对此文件执行XPath查询(显示的摘录): 这是我正在使用的代码的摘要: 我面临的问题是,在XPath查询中引用默认名称空间时,不会调用getNamespaceURI方法来解决它。例如,此查询不提取任何内容: 现在,我尝试通过用假前缀替换来“诱骗”解析器,然后相应地编写方法(以便在遇到问题时返回)。在这种情况下,将调用,但是XPath表达式求值的结果始终是一个空字符串。 如果我从文

  • 我想对这个文件进行XPath查询(显示节选): 这是我正在使用的代码片段: 我面临的问题是,在XPath查询中引用默认名称空间时,不会调用getNamespaceURI方法来解决它。例如,此查询不提取任何内容: 现在,我尝试“欺骗”解析器,用假前缀替换,然后相应地编写方法(以便返回当遇到时)。在本例中,调用了,但XPath表达式求值的结果始终是空字符串。 如果我从文件和XPath查询表达式中去掉名

  • 在下面的示例中,我试图检索元素的最后一个和倒数第二个条目: 使用返回几乎所有内容,使用失败。 有什么建议吗? 更新:此XPath查询用于Google Sheets。