Python 不一致的Scrapy Xpath行为(OS X+Linux)
我在Scrapy中使用Xpath选择器时遇到问题。每当我在OSX上运行spider时,选择器都会按预期工作;然而,当我在Ubuntu12.04和Raspbian中运行相同的脚本时,选择器不起作用。我不知道为什么会这样 选择器是: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
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]: