0

好吧,这开始让我有点发疯了。我已经尝试了几个用于 Python 的 xml/xpath 库,但无法找到一种简单的方法来获取臭名昭著的“标题”元素。

最新的尝试看起来像这样(使用 Amara):

def view(req, url):
    req.content_type = 'text/plain'
    doc = amara.parse(urlopen(url))
    for node in doc.xml_xpath('//title'):
    req.write(str(node)+'\n')

但这什么也没打印出来。我的 XML 看起来像这样: http: //programanddesign.com/feed/atom/

如果我尝试//*而不是//title它按预期返回所有内容。我知道 XML 里面有titles,那么有什么问题呢?是命名空间还是什么?如果是这样,我该如何解决?


似乎无法让它在没有前缀的情况下工作,但这确实有效:

def view(req, url):
    req.content_type = 'text/plain'
    doc = amara.parse(url, prefixes={'atom': 'http://www.w3.org/2005/Atom'})
    req.write(str(doc.xml_xpath('//atom:title')))
4

2 回答 2

1

您可能只需要考虑您正在处理的文档的名称空间。

我建议在 Amara 中查找如何处理名称空间:

http://www.xml3k.org/Amara/Manual#namespaces

编辑:使用您的代码片段,我进行了一些编辑。我不知道您使用的是哪个版本的 Amara,但根据我尝试尽可能多地适应它的文档:

def view(req, url):
    req.content_type = 'text/plain'
    ns = {u'f' : u'http://www.w3.org/2005/Atom',
        u't' : u'http://purl.org/syndication/thread/1.0'}
    doc = amara.parse(urlopen(url), prefixes=ns)
    req.write(str(doc.xml_xpath(u'f:title')))
于 2009-10-18T06:46:57.483 回答
1

它确实是名称空间。在 lxml 文档中查找有点棘手,但您可以这样做:

from lxml import etree
doc = etree.parse(open('index.html'))
doc.xpath('//default:title', namespaces={'default':'http://www.w3.org/2005/Atom'})

你也可以这样做:

title_finder = etree.ETXPath('//{http://www.w3.org/2005/Atom}title')
title_finder(doc)

在这两种情况下,你都会得到标题。

于 2009-10-18T07:08:03.473 回答