【问题标题】:parse xpath from xml file should contain '从 xml 文件解析 xpath 应包含 '
【发布时间】:2014-03-12 23:23:37
【问题描述】:

这是我的 xml 文件

<Item name="Date" xpath='p[@class="date"]/text()' defaultValue="Date Not Found"></Item>

我是这样解析的:

self.doc=etree.parse(xmlFile)
masterItemsFromXML = self.doc.findall('MasterPage/MasterItems/Item')
        for oneItem in masterItemsFromXML:
            print 'master item xpath = {0}'.format(oneItem.attrib['xpath'])

我可以看到打印在cmd 中的结果如下:

master item xpath =p[@class="date"]/text()

我的问题

xpath 无效,因为它应该以 ' 开头并以 '

结尾

我尝试了什么

我试过了

name="Date" xpath='''p[@class="date"]/text()'''

但后来我在解析 xml 时出错了。

帮助

【问题讨论】:

  • 属性周围的引号不是属性值的一部分。您的xpath 属性值为p[@class="date"]/text()。

标签: python xml python-2.7 xpath scrapy


【解决方案1】:

在 XML 中,属性值总是用单引号或双引号引起来。有关详细信息,请参阅the spec。这些引号不是属性值的一部分。因此,正如所写,您的属性值是 p[@class="date"]/text() — 正是您从代码中得到的。

那么,如果你想在实际值中同时包含单引号和双引号怎么办?好吧,如果你单引号这个值,它里面不能有单引号;如果你双引号,它里面不能有双引号;并且没有其他选择。

Python 有一个很好的解决方案,将文字周围的引号增加三倍,但这只是 Python。其他语言有不同的解决方案,例如将文字中间的引号加倍,或使用反斜杠转义。

XML 拥有的是entity reference and character references。所以,这些都是你想要的:

<Item name="Date" xpath="'p[@class=&quot;date&quot;]/text()'" defaultValue="Date Not Found"></Item>

<Item name="Date" xpath="'p[@class=&#34;date&#34;]/text()'" defaultValue="Date Not Found"></Item>

<Item name="Date" xpath='&apos;p[@class="date"]/text()&apos;' defaultValue="Date Not Found"></Item>

<Item name="Date" xpath='&#39;p[@class="date"]/text()&#39;' defaultValue="Date Not Found"></Item>

现在您有了一个正确引用的属性值,其中包含单引号。


说了这么多,你确定你真的想要xpath 值中的那些单引号吗?毕竟,没有这些引号,它是一个有效的 XPath 表达式;与他们,它不是。如果您只想在有效值周围打印引号,而不是将它们嵌入到值中,那就更容易了:

print "master item xpath = '{0}'".format(oneItem.attrib['xpath'])

【讨论】:

  • 我试过你的解决方案,我得到了这个结果''value''。请注意我正在从 python 读取 xml
  • 我想要一个而不是两个
  • @MarcoDinatsoli:听起来您实际上尝试了 both 解决方案:将引号放入 XML 属性值,并在值周围打印引号。只需做一个或另一个,无论你真正想要哪一个。
  • 我尝试了你的第三个解决方案,它给了我两个引号
  • @MarcoDinatsoli: Here 你可以看到它完全按照描述工作。它不会打印出两个引号。您显然在您的 XML 或代码中做错了什么,但没有看到您实际运行的内容,我无法为您调试它。
【解决方案2】:

使用一个元素:

<Item ...>
  <xpath>p[@class="date"]/text()</xpath>
</Item>

【讨论】:

  • 我正在测试您的解决方案。
猜你喜欢
  • 2022-11-19
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多