这是先前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
答案 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
变量。
希望这可以指出你的解决方案