我正在尝试从网址中删除匹配计划。使用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>
答案 0 :(得分:2)
scrapy shell中的xpath与蜘蛛中的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.还要将a
添加到clubs
类以优化提取的文本
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
答案 1 :(得分:1)
我不确定这是否是最简单的方法,但它以所需的格式输出信息。请测试一下,如果需要调整,请告诉我。 :)
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