从xml文件解析xpath应该包含'

时间:2014-02-13 20:46:59

标签: python xml python-2.7 xpath scrapy

这是我的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时出错了。

帮助

2 个答案:

答案 0 :(得分:2)

在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'])

答案 1 :(得分:0)

使用元素:

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