Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 从已删除的URL中删除信息_Python_Scrapy - Fatal编程技术网

Python 从已删除的URL中删除信息

Python 从已删除的URL中删除信息,python,scrapy,Python,Scrapy,我是scrapy的新手,目前正在学习如何从一个被删除的URL列表中删除信息。我已经能够通过浏览scrapy网站上的教程从url中获取信息。然而,即使在谷歌在线搜索解决方案之后,我也面临着从一个url中抓取的url列表中抓取信息的问题 我在下面编写的scraper能够从第一个url中进行刮取。但是,它无法从已删除的URL列表中删除。问题从以下URL(self,response)的def parse_开始:因此我无法从已删除的URL列表中删除 有人能帮忙解决这个问题吗?先谢谢你 import scr

我是scrapy的新手,目前正在学习如何从一个被删除的URL列表中删除信息。我已经能够通过浏览scrapy网站上的教程从url中获取信息。然而,即使在谷歌在线搜索解决方案之后,我也面临着从一个url中抓取的url列表中抓取信息的问题

我在下面编写的scraper能够从第一个url中进行刮取。但是,它无法从已删除的URL列表中删除。问题从以下URL(self,response)的def parse_开始:因此我无法从已删除的URL列表中删除

有人能帮忙解决这个问题吗?先谢谢你

import scrapy
from scrapy.http import Request

class SET(scrapy.Item):
    title = scrapy.Field()
    open = scrapy.Field()
    hi = scrapy.Field()
    lo = scrapy.Field()
    last = scrapy.Field()
    bid = scrapy.Field()
    ask = scrapy.Field()
    vol = scrapy.Field()
    exp = scrapy.Field()
    exrat = scrapy.Field()
    exdat = scrapy.Field()

class ThaiSpider(scrapy.Spider):
    name = "warrant"
    allowed_domains = ["marketdata.set.or.th"]
    start_urls = ["http://marketdata.set.or.th/mkt/stocklistbytype.do?market=SET&language=en&country=US&type=W"]

    def parse(self, response):
        for sel in response.xpath('//table[@class]/tbody/tr'):
            item = SET()
            item['title'] = sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/text()').extract()
            item['open'] = sel.xpath('td[3]/text()').extract()
            item['hi'] = sel.xpath('td[4]/text()').extract()
            item['lo'] = sel.xpath('td[5]/text()').extract()
            item['last'] = sel.xpath('td[6]/text()').extract()
            item['bid'] = sel.xpath('td[9]/text()').extract()
            item['ask'] = sel.xpath('td[10]/text()').extract()
            item['vol'] = sel.xpath('td[11]/text()').extract()
            yield item
        urll = response.xpath('//table[@class]/tbody/tr/td[1]/a[contains(@href,"ssoPageId")]/@href').extract()
        urls = ["http://marketdata.set.or.th/mkt/"+ i for i in urll]
        for url in urls:
            request = scrapy.Request(url, callback=self.parse_following_urls, dont_filter=True)
            yield request
        request.meta['item'] = item

    def parse_following_urls(self, response):
        for sel in response.xpath('//table[3]/tbody'):
            item = response.meta['item']
            item['exp'] = sel.xpath('tr[1]/td[2]/text()').extract()
            item['exrat'] = sel.xpath('tr[2]/td[2]/text()').extract()
            item['exdat'] = sel.xpath('tr[3]/td[2]/text()').extract()
            yield item
在尝试给出的建议并查看输出后,我重新编写了代码。下面是编辑后的代码。但是,我遇到另一个错误,该错误指出
请求url必须是str或unicode,得到%s:“%type(url)。\uuu name\uuu)
。如何将URL从列表转换为字符串

我认为URL应该是字符串,因为它在For循环中。我在下面的代码中添加了这个注释。有什么办法解决这个问题吗

import scrapy
from scrapy.http import Request

class SET(scrapy.Item):
    title = scrapy.Field()
    open = scrapy.Field()
    hi = scrapy.Field()
    lo = scrapy.Field()
    last = scrapy.Field()
    bid = scrapy.Field()
    ask = scrapy.Field()
    vol = scrapy.Field()
    exp = scrapy.Field()
    exrat = scrapy.Field()
    exdat = scrapy.Field()

class ThaiSpider(scrapy.Spider):
    name = "warrant"
    allowed_domains = ["marketdata.set.or.th"]
    start_urls = ["http://marketdata.set.or.th/mkt/stocklistbytype.do?market=SET&language=en&country=US&type=W"]

    def parse(self, response):
        for sel in response.xpath('//table[@class]/tbody/tr'):
            item = SET()
            item['title'] = sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/text()').extract()
            item['open'] = sel.xpath('td[3]/text()').extract()
            item['hi'] = sel.xpath('td[4]/text()').extract()
            item['lo'] = sel.xpath('td[5]/text()').extract()
            item['last'] = sel.xpath('td[6]/text()').extract()
            item['bid'] = sel.xpath('td[9]/text()').extract()
            item['ask'] = sel.xpath('td[10]/text()').extract()
            item['vol'] = sel.xpath('td[11]/text()').extract()
            url = ["http://marketdata.set.or.th/mkt/"]+ sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/@href').extract()
            request = scrapy.Request(url, callback=self.parse_following_urls, dont_filter=True) #Request url must be str or unicode, got list: How to solve this?
            request.meta['item'] = item
            yield item
            yield request

    def parse_following_urls(self, response):
        for sel in response.xpath('//table[3]/tbody'):
            item = response.meta['item']
            item['exp'] = sel.xpath('tr[1]/td[2]/text()').extract()
            item['exrat'] = sel.xpath('tr[2]/td[2]/text()').extract()
            item['exdat'] = sel.xpath('tr[3]/td[2]/text()').extract()
            yield item

我试着改变第五行的倒数

item = response.meta['item']

那就行了!
事实上,我不太了解你的“元”方式,因为我从来没有用它来描述这个项目

我知道您在这里试图做什么,这就是所谓的链接请求

这意味着您希望继续满足
请求
s,并在
请求中继续携带您填写的
项目
s
meta
属性

对于您的情况,您所需要做的只是生成
项目
生成一个
请求
,其中包含一个项目。将解析更改为:

def parse(self, response):
    for sel in response.xpath('//table[@class]/tbody/tr'):
        item = SET()
        item['title'] = sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/text()').extract()
        item['open'] = sel.xpath('td[3]/text()').extract()
        item['hi'] = sel.xpath('td[4]/text()').extract()
        item['lo'] = sel.xpath('td[5]/text()').extract()
        item['last'] = sel.xpath('td[6]/text()').extract()
        item['bid'] = sel.xpath('td[9]/text()').extract()
        item['ask'] = sel.xpath('td[10]/text()').extract()
        item['vol'] = sel.xpath('td[11]/text()').extract()
        urll = response.xpath('//table[@class]/tbody/tr/td[1]/a[contains(@href,"ssoPageId")]/@href').extract()
        urls = ["http://marketdata.set.or.th/mkt/" + i for i in urll]
        for url in urls:
            yield scrapy.Request(url,
                                 callback=self.parse_following_urls,
                                 meta={'item': item})

我看到的一个问题是,在
parse
方法的末尾有
request.meta['item']=item
行,它什么也不做。要将项添加到请求元,您需要在创建
request
对象时执行此操作<代码>scrapy.Request(url,self.callback\u func,meta={'item':item})
。现在,它不再在
item=response.meta['item']
行中断。它确实解决了问题,但输出仅包含从已删除URL列表的最后一个URL中删除的信息。是否有其他方法编辑代码,以便从“已删除URL”列表中删除所有URL中的所有信息?将最后第5行从
item=response.meta['item']
更改为
item=SET()
使代码半正确。它能够从被刮取的URL列表中刮取信息,但无法通过解析(self,response)输出信息:我现在遇到的问题是将项目从第一个解析函数
parse(self,response)
传递到URL(self,response)后面的第二个解析函数
parse\u
以便在项目中填充来自不同URL的不同字段。实际上,我已经阅读了scrapy教程和示例,并尝试了代码,但没有成功。有人知道如何解决这个问题吗?对于你的“输出”字,你是否正确地编写了管道代码?因为我使用了我自己的管道和你的spider代码,它更改了最后第5行,然后juse success(具体的“exp”内容就在我的item.json中),这种输出正确吗?我的最后一项是:[“],“exp”:[“3.50”],“exdat”:[“01/06/2018”]}您仍然可以获得已删除的信息,但它不在输出数据中的正确位置。最后一行应该包括所有11个字段,但您的代码没有给出前8个字段
def parse(self, response):
    for sel in response.xpath('//table[@class]/tbody/tr'):
        item = SET()
        item['title'] = sel.xpath('td[1]/a[contains(@href,"ssoPageId")]/text()').extract()
        item['open'] = sel.xpath('td[3]/text()').extract()
        item['hi'] = sel.xpath('td[4]/text()').extract()
        item['lo'] = sel.xpath('td[5]/text()').extract()
        item['last'] = sel.xpath('td[6]/text()').extract()
        item['bid'] = sel.xpath('td[9]/text()').extract()
        item['ask'] = sel.xpath('td[10]/text()').extract()
        item['vol'] = sel.xpath('td[11]/text()').extract()
        urll = response.xpath('//table[@class]/tbody/tr/td[1]/a[contains(@href,"ssoPageId")]/@href').extract()
        urls = ["http://marketdata.set.or.th/mkt/" + i for i in urll]
        for url in urls:
            yield scrapy.Request(url,
                                 callback=self.parse_following_urls,
                                 meta={'item': item})