Scrapy / Python问题:[count]不收集整个表

时间:2013-08-10 16:24:12

标签: python web-crawler scrapy

这是先前XPath线程的衍生物(dude告诉我它不是与XPath相关的)。

所以我试图抓住这个网页:http://www.baseball-reference.com/teams/BOS/2013.shtml排名,位置,姓名,年龄等。

每当我使用:

item['rank'] = stat.select('//table[@id="team_batting"]/tbody/tr/td[1]//text()')[count].extract()
item ['position'] = stat.select('//table[@id="team_batting"]/tbody/tr/td[2]//text()')[count].extract()

它只给了我5个结果:

[{"position": "C", "rank": "1"},
{"position": "1B", "rank": "2"},
{"position": "2B", "rank": "3"},
{"position": "SS", "rank": "4"},
{"position": "3B", "rank": "5"}]

如果我删除了[count],它会给我所有的等级和位置,但不是正确的格式,它给了我4个重复的行(我把它浓缩到这里,有44个):

{"position": ["C", "1B", "2B", "SS", "3B", "LF"], "rank": ["1", "2", "3", "4", "5", "6", "7"]}

这是我的解析器代码,这将有所帮助:

def parse(self, response):
 hxs = HtmlXPathSelector(response)
 stats = hxs.select('//div[@class="table_container"]')
 count = 0
 items = []

 for stat in stats:

     item = MlbrefItem()

     items .append(item)
     count +=1


 return items

我很困惑。当我完成本教程时:http://davidwalsh.name/python-scrape [count]取得了所有结果。我也没有在另一个网站上尝试这个问题。但这是我需要的网站。

非常感谢任何帮助。感谢

编辑:以下是实际代码(忽略评论):https://www.dropbox.com/s/rk29kotd09kioeg/mlbref_spyder.py

1 个答案:

答案 0 :(得分:0)

您发布的代码没有 MlbrefItem 类的定义。此外,从发布的代码中可以看出,您在以下行中有不正确的缩进:

items.append(item)

您正在for循环之外追加item个对象。这意味着您最终只会附加 MlbrefItem 类型的最终实例。请尝试以下for-loop的代码段,并告知我们是否有效:

for stat in stats:

    item = MlbrefItem()

    items .append(item)
    count +=1

基于与AngryWhopper

讨论的重大编辑

这里有多个方面需要考虑:

页面上有5个div,样式为 table_container 语句stats = hxs.select('//div[@class="table_container"]')选择所有这5个元素

提供的参考链接的源代码如下所示。我已经添加了注释到以我的用户名开头的代码,其中增加了计数(count += 1)。因为这是在for循环内,所以这只发生了5次。因此,在5次中,您最终只选择XPATH选择器为位置和排名返回的行列表中的单个元素。这解释了为什么在代码中使用count变量时只能获得5对。

stats = hxs.select('//div[@class="table_container"]')
        count = 0
        items = []

        for stat in stats:

            item = MlbrefItem()

            item['rank'] = stat.select('//table[@id="team_batting"]/tbody/tr/td[1]//text()').extract()
             item ['position'] = stat.select('//table[@id="team_batting"]/tbody/tr/td[2]//text()').extract()

            items .append(item)
            count +=1 #PrahaladDeshpande - This count variable is incremented only 5 times since it is within the for loop

        return items

如果没有count变量,则会获得所有行 - 但是它们的格式不正确。好吧,在这里你将不得不做一些工作。我在scrapy终端上尝试了一些实验,下面的代码片段应该可以为你效用

stats = hxs.select('//div[@class="table_container"]')
for stat in stats:
        rank_list = stat.select('//table[@id="team_batting"]/tbody/tr/td[1]//text()').extract()
        position_list = stat.select('//table[@id="team_batting"]/tbody/tr/td[2]//text()').extract()

         //TODO : verify that the length of the rank_list and position_list are the same. Else throw an error
         for i in range(0, len(rank_list)):
             item = MlbrefItem()
             item['rank'] = rank_list[i]
             item['position'] = position_list[i]
             items.append(item)

然后,您可以从方法中返回items变量。

希望这可以指出你的解决方案