使用scrapy不以XML或JSON格式删除数据

时间:2014-02-23 15:54:10

标签: python xml web-scraping scrapy

我正在尝试从网址中删除匹配计划。使用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>

2 个答案:

答案 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

抓取什么

编辑:你必须避免进入循环trmatchDate它放在与其他两行不同的行中,而是执行以下操作:

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