Python 不一致的Scrapy Xpath行为(OS X+Linux)

Python 不一致的Scrapy Xpath行为(OS X+Linux),python,linux,macos,xpath,scrapy,Python,Linux,Macos,Xpath,Scrapy,我在Scrapy中使用Xpath选择器时遇到问题。每当我在OSX上运行spider时,选择器都会按预期工作;然而,当我在Ubuntu12.04和Raspbian中运行相同的脚本时,选择器不起作用。我不知道为什么会这样 选择器是: sel.xpath('//table[@class="times"]') 这将向我返回两个表选择器,但当我进一步添加索引以选择返回的第二个表时: sel.xpath('//table[@class="times"][2]') OSX将第二个表返回给我没有问题,而Ub

我在Scrapy中使用Xpath选择器时遇到问题。每当我在OSX上运行spider时,选择器都会按预期工作;然而,当我在Ubuntu12.04和Raspbian中运行相同的脚本时,选择器不起作用。我不知道为什么会这样

选择器是:

sel.xpath('//table[@class="times"]')
这将向我返回两个表选择器,但当我进一步添加索引以选择返回的第二个表时:

sel.xpath('//table[@class="times"][2]')
OSX将第二个表返回给我没有问题,而Ubuntu/Raspbian没有返回任何内容:[]

我完全不知道为什么会这样。我已经尽了最大努力来复制环境scrapy版本0.20,Python2.7,但我仍然没有找到答案。作为参考,我试图通过shell刮取的页面是

scrapy shell "http://washington.dc.gegov.com/webadmin/dhd_431/lib/mod/inspection/paper/_paper_food_inspection_report.cfm?inspectionID=200651&wgdmn=431&wguid=1367&wgunm=sysact"
感谢您在这方面提供的帮助。

使用//table[@class=times][2]时要小心:它将选择所有具有其父元素类时间的子代表元素。所以,如果一个节点只有一个子表和类时间,那么这个节点就没有匹配项

它与//table[@class=times][2]不同,后者将在根节点下提供第二个表,其中包含类时间,这可能是您想要的。您还可以使用/degenant::table[@class=times][2]

它仍然不同于//table[2][@class=times],它选择的所有子代表元素都是其父代的第二个子元素,并且都有类时间

请参见关于缩写语法的//:

注意:位置路径//para与位置路径/后代::para的含义不同。后者选择第一个子代para元素;前者选择作为其父级第一个para子级的所有子级para元素

让我们用scrapy shell会话来说明这一点

另一件事,在示例页面中,我看到4个表的class属性中包含时间:


sel.xpath“//table[@class=times]”是否在两个环境中返回相同的内容?是的,两个环境都返回2个选择对象。只有当我尝试通过[2]索引调用它时,我才得到不同的结果。您是否检查了selection对象的内容在两种环境(即sel)中是否相同。在第二种情况下,xpath“//table[@class=times]”不是[]?或者在第二种情况下,索引从0开始,因此您超出了选择的长度?这解决了我的问题。添加//table[@class=times][2]正确地拉取了我需要的节点,谢谢!对我来说很奇怪的是,这在OSX上完全起作用,但在其他*nix环境上却不起作用。
paul@wheezy:~$ scrapy shell "http://washington.dc.gegov.com/webadmin/dhd_431/lib/mod/inspection/paper/_paper_food_inspection_report.cfm?inspectionID=200651&wgdmn=431&wguid=1367&wgunm=sysact"

In [1]: sel.xpath('//table[@class="times"][2]')
Out[1]: []

In [2]: sel.xpath('(//table[@class="times"])[2]')
Out[2]: [<Selector xpath='(//table[@class="times"])[2]' data=u'<table class="times" style="font-size:9p'>]

In [3]: sel.xpath('/descendant-or-self::table[@class="times"]')
Out[3]: 
[<Selector xpath='/descendant-or-self::table[@class="times"]' data=u'<table class="times" style="margin-top:1'>,
 <Selector xpath='/descendant-or-self::table[@class="times"]' data=u'<table class="times" style="font-size:9p'>]

In [4]: sel.xpath('/descendant-or-self::table[@class="times"][2]')
Out[4]: [<Selector xpath='/descendant-or-self::table[@class="times"][2]' data=u'<table class="times" style="font-size:9p'>]

In [5]: sel.xpath('/descendant::table[@class="times"][2]')
Out[5]: [<Selector xpath='/descendant::table[@class="times"][2]' data=u'<table class="times" style="font-size:9p'>]

In [6]: