gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 12:16:59 25 4
gpt4 key购买 nike

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

选择器是:

sel.xpath('//table[@class="times"]')

它向我返回表的 2 个选择器,但是当我更进一步并添加索引以选择返回的第二个表时:

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

OS X 毫无问题地返回第二张表,而 Ubuntu/Raspbian 什么都不返回:[]

我完全不知道为什么会这样。我已尽力复制环境(scrapy 版本 0.20,python 2.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] :它将选择其父元素的类为“times”的所有后代第二个子表元素。因此,如果一个节点只有 1 个带有“times”类的子表,则该节点不匹配。

它与(//table[@class="times"])[2] 不同这将为您提供根节点下带有类“times”的第二个表(这可能是您想要的)。您也可以使用 /descendant::table[@class="times"][2] .

而且还是和//table[2][@class="times"]不一样选择所有作为其父项的第二个子元素且具有类“times”的后代表元素。

参见 XPath 1.0 specifications关于缩写语法 // :

NOTE: The location path //para1 does not mean the same as the location path /descendant::para1. The latter selects the first descendant para element; the former selects all descendant para elements that are the first para children of their parents.

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

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]:

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

  • <table class="times" style="margin-top:1...
  • <table class="times" style="font-size:9p...
  • <table class="times pt6" cellpadding="0"...
  • <table class="times fs_10px" style="bord...

所以请记住 [@class="times"]谓词意味着类属性正好是“时间”,而不是简单地包含“时间”(你可以使用 [contains(@class, "times")] 来表示)

关于python - 不一致的 Scrapy Xpath 行为(OS X + Linux),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21316621/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com