0

这是从以前的 XPath 线程衍生出来的(老兄告诉我它与 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

4

1 回答 1

0

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

items.append(item)

item在 for 循环之外附加了一个对象。这意味着您最终只附加了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变量。

希望这会为您指明解决方案

于 2013-08-10T17:01:44.573 回答