未使用刮擦在 XML 或 JSON 中抓取的数据



我正在尝试从网址中抓取比赛时间表。使用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&paramComp_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

最新更新