代码之家  ›  专栏  ›  技术社区  ›  mpen

python xpath不工作?

  •  0
  • mpen  · 技术社区  · 16 年前

    好吧,这开始让我有点发疯了。我已经为python尝试了几个XML/xpath库,但无法找到一个简单的方法来获得臭名昭著的“title”元素。

    最新尝试如下(使用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 title 在里面,有什么问题?它是名称空间还是什么?如果是的话,我怎么修?


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

    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')))
    
    2 回复  |  直到 16 年前
        1
  •  1
  •   meder omuraliev    16 年前

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

    我建议您查找如何处理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')))
    
        2
  •  1
  •   Lennart Regebro    16 年前

    它确实是名称空间。在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)
    

    在这两种情况下,你都会得到头衔。