我正在尝试从网址中抓取比赛时间表。使用scrapy shell
我能够获得所需的结果。但是当通过spider
完成时,不会检索任何数据。我是这样做的:
class ScheduleSpider (Spider):
name = "fplscheduler"
allowed_domains = ["fantasy.premierleague.com"]
start_urls = [
"http://www.premierleague.com/en-gb/matchday/matches.html?paramClubId=ALL¶mComp_100=true&view=.dateSeason"
]
def parse(self, response):
hxs = HtmlXPathSelector(response)
completeSchedule= hxs.select("//div[@class='fixturelist section']//table[@class='contentTable']//tr")
items = []
for schedule in completeSchedule:
item = FplserviceItem()
item["time"] = schedule.select("td[@class='time']//text").extract()
item["matchDate"] = schedule.select("th[@colspan='6']//text").extract()
item["match"] = schedule.select("td[@class='clubs']//text").extract()
items.append(item)
return items
其中一个命令在 shell 上运行以通过start_url
获取匹配项:
sel.xpath("//div[@class='fixturelist section']//table[@class='contentTable']//tr//td[@class='clubs']//text()").extract()
这是我运行以生成xml
的命令:
scrapy crawl fplscheduler -o schedule.xml -t xml
这是我的 xml 文件的输出:
<items><item><match/><matchDate/><time/></item><item><match/><matchDate/><time/></item><item><match/><matchDate/><time/></item><item><match/><matchDate/><time/></item><item><match/><matchDate/><time/></item>....</items>
节点中没有数据。
我在这里做错了什么?
更新以下是所做的更改:
for schedule in completeSchedule:
item = FplserviceItem()
item["time"] = schedule.select("td[@class='time']//text()").extract()
item["matchDate"] = schedule.select("th[@colspan='6']//text()").extract()
item["match"] = schedule.select("td[@class='clubs']//a/text()").extract()
items.append(item)
return items
现在这是输出:
<items><item><match/><matchDate><value>Saturday 1 March 2014 </value></matchDate><time/></item><item><match><value>Everton v West Ham</value></match><matchDate/><time><value>15:00</value></time></item>...</items>
现在,每个对象每个节点包含一个值。我需要这样:
<items><item><match><value>Everton v West Ham</value></match><matchDate><value>Saturday 1 March 2014 </value></matchDate><time><value>15:00</value></time></item>...</items>
Scrapy shell 中的 xpath 与 spider 中的 xpath 不同。
1.在蜘蛛Xpath中将text
更改为text()
item["time"] = schedule.select("td[@class='time']//text()").extract()
item["match"] = schedule.select("td[@class='clubs']//a/text()").extract()
2.同时clubs
类中添加a
以优化提取的文本
3.不确定你试图用什么刮matchDate
编辑:您必须避免在循环中进入tr
,因为它matchDate
与其他两个行放在不同的行中,而是执行以下操作:
completeSchedule= hxs.select("//div[@class='fixturelist section']//table[@class='contentTable']")
items = []
for schedule in completeSchedule:
item = FplserviceItem()
item["time"] = schedule.select("tr//td[@class='time']//text()").extract()
item["matchDate"] = schedule.select("tr//th[@colspan='6']//strong[1]/text()").extract()
item["match"] = schedule.select("tr//td[@class='clubs']//a/text()").extract()
items.append(item)
return items
我不确定这是否是最简单的方法,但它以所需的格式输出信息。请进行测试,如果需要任何调整,请告诉我。:)
def parse(self, response):
hxs = HtmlXPathSelector(response)
completeSchedule= hxs.select("//div[@class='fixturelist section']//table[@class='contentTable']")
items = []
for schedule in completeSchedule:
matchDate = schedule.select("tr//th[@colspan='6']/text()").extract()[0]
times = schedule.select("tr//td[@class='time']//text()").extract()
matches = schedule.select("tr//td[@class='clubs']//a/text()").extract()
for m, t in zip(matches, times):
item = FplserviceItem()
item["matchDate"] = matchDate
item["match"] = m
item["time"] = t
items.append(item)
return items