【问题标题】:Xpath explanation in code代码中的 Xpath 解释
【发布时间】:2011-03-31 13:52:15
【问题描述】:

在我工作的公司中,我不得不深入研究这部分代码。您的其中一个解析失败,并且怀疑这部分代码存在错误,但由于我的经验,我无法确切地弄清楚它应该做什么。

from lxml import etree
uni = etree.tounicode

def results(self):
    return [(e.attrib['href'], uni(e))
            for e in self.doc.xpath('//li[@class="g" and not(class="localbox")]//a[@class="l"]')]

【问题讨论】:

  • “一个错误”是非常普遍的。您能否编辑您的问题以提供 1) XML 文件的相关位——如有必要,更改/删除绝密信息、2) 预期输出和 3) 当前输出?如果引发异常,则为完整的回溯...
  • @Adam 目的是解析谷歌搜索的结果。 Google 在 ul 中构建结果并给出相关类,
  • Bar

    一个>
  • 如果不提供用于评估 XPath 表达式的 XML 文档,这个问题就毫无意义。请记住从现在开始这样做。
  • 标签: python xpath elementtree


    【解决方案1】:

    XPath 表达式执行以下操作:

    //li[@class="g" and not(class="localbox")]//a[@class="l"]
      ^        ^              ^                 ^       ^
      1        2              3                 4       5
    
    1. 查找所有出现的<li> 元素
    2. 有一个名为class 的属性,其值为g(例如<li class="g">
    3. 没有子元素 class 和字符串值 localbox(稍后会解释)
    4. 之后,它会在 <li> 元素“内部”找到所有 <a> 元素
    5. 属性名称为class,值为1(例如<a class="1">

    有趣的部分是3。可能@前面少了一个class。在这种情况下,语句将是:3. 没有属性名称 class 和值 localbox

    节点元素的隐式字符串值转换和比较是...至少可以说容易出错。我不认为你想要那样的东西。

    希望对你有帮助。

    【讨论】:

    • 好玩的部分是3。大概课前少了一个@。在这种情况下,语句将是: 3. 没有值为 localbox 的属性名称类。 - 检查@class="g" and not(@class="localbox") 的原因是什么?如果第一个为真,则第二个始终为真。
    • @khachik - 我的猜测是目标元素有多个类名(由空格分隔),这是一种错误的尝试,只检索具有一个但没有另一个的元素。
    • @khachik 你有什么想法,例如如何检查有 class="l" 或没有类的链接?
    • @Chris-Top @lwburk:我刚才说过如果@class="g" 在那种情况下第二个总是正确的:not(@class="localbox"),所以将class="localhost" 更改为@class="localhost" 是没有意义的。跨度>
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签