Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.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 Scrapy:从源及其链接提取数据_Python_Xpath_Scrapy_Scrapy Spider - Fatal编程技术网

Python Scrapy:从源及其链接提取数据

Python Scrapy:从源及其链接提取数据,python,xpath,scrapy,scrapy-spider,Python,Xpath,Scrapy,Scrapy Spider,已编辑的问题链接到原始: 从链接 我试图从主表以及表中其他2个链接中获取信息。我设法从一个链接中提取,但问题是转到另一个链接并将数据附加到一行中 from urlparse import urljoin import scrapy from texasdeath.items import DeathItem class DeathItem(Item): firstName = Field() lastName = Field() Age = Field()

已编辑的问题链接到原始:

从链接

我试图从主表以及表中其他2个链接中获取信息。我设法从一个链接中提取,但问题是转到另一个链接并将数据附加到一行中

from urlparse import urljoin

import scrapy

from texasdeath.items import DeathItem

class DeathItem(Item):
    firstName = Field()
    lastName = Field()
    Age = Field()
    Date = Field()
    Race = Field()
    County = Field()
    Message = Field()
    Passage = Field()

class DeathSpider(scrapy.Spider):
    name = "death"
    allowed_domains = ["tdcj.state.tx.us"]
    start_urls = [
        "http://www.tdcj.state.tx.us/death_row/dr_executed_offenders.html"
    ]

    def parse(self, response):
        sites = response.xpath('//table/tbody/tr')
        for site in sites:
            item = DeathItem()

            item['firstName'] = site.xpath('td[5]/text()').extract()
            item['lastName'] = site.xpath('td[4]/text()').extract()
            item['Age'] = site.xpath('td[7]/text()').extract()
            item['Date'] = site.xpath('td[8]/text()').extract()
            item['Race'] = site.xpath('td[9]/text()').extract()
            item['County'] = site.xpath('td[10]/text()').extract()

            url = urljoin(response.url, site.xpath("td[3]/a/@href").extract_first())
            url2 = urljoin(response.url, site.xpath("td[2]/a/@href").extract_first())
            if url.endswith("html"):
                request = scrapy.Request(url, meta={"item": item,"url2" : url2}, callback=self.parse_details)
                yield request
            else:
                yield item
def parse_details(self, response):
    item = response.meta["item"]
    url2 = response.meta["url2"]
    item['Message'] = response.xpath("//p[contains(text(), 'Last Statement')]/following-sibling::p/text()").extract()
    request = scrapy.Request(url2, meta={"item": item}, callback=self.parse_details2)
    return request

def parse_details2(self, response):
    item = response.meta["item"]
    item['Passage'] = response.xpath("//p/text()").extract_first()
    return item
我理解我们如何将参数传递给请求和元数据。但仍不清楚流程,在这一点上,我不确定这是否可能。我看过几个例子,包括下面的例子:

从技术上讲,数据将反映主表,两个链接都包含其链接中的数据


感谢您的帮助或指导。

本例中的问题在于这段代码

if url.endswith("html"):
        yield scrapy.Request(url, meta={"item": item}, callback=self.parse_details)
    else:
        yield item

if url2.endswith("html"):
        yield scrapy.Request(url2, meta={"item": item}, callback=self.parse_details2)
    else:
        yield item
通过请求一个链接,您正在创建一个新的“线程”,它将经历自己的生命历程,因此,函数parse_details将无法看到parse_details2中正在执行的操作,我将以这种方式彼此调用一个

url = urljoin(response.url, site.xpath("td[2]/a/@href").extract_first())

url2 = urljoin(response.url, site.xpath("td[3]/a/@href").extract_first()

if url.endswith("html"):
    request=scrapy.Request(url, callback=self.parse_details)
    request.meta['item']=item
    request.meta['url2']=url2
    yield request
elif url2.endswith("html"):
    request=scrapy.Request(url2, callback=self.parse_details2)
    request.meta['item']=item
    yield request

else:
    yield item


def parse_details(self, response):
    item = response.meta["item"]
    url2 = response.meta["url2"]
    item['About Me'] = response.xpath("//p[contains(text(), 'About Me')]/following-sibling::p/text()").extract()
    if url2:
        request=scrapy.Request(url2, callback=self.parse_details2)
        request.meta['item']=item
        yield request
    else:
        yield item

此代码尚未经过彻底测试,因此请在测试时进行注释

本例中的问题就在这段代码中

if url.endswith("html"):
        yield scrapy.Request(url, meta={"item": item}, callback=self.parse_details)
    else:
        yield item

if url2.endswith("html"):
        yield scrapy.Request(url2, meta={"item": item}, callback=self.parse_details2)
    else:
        yield item
通过请求一个链接,您正在创建一个新的“线程”,它将经历自己的生命历程,因此,函数parse_details将无法看到parse_details2中正在执行的操作,我将以这种方式彼此调用一个

url = urljoin(response.url, site.xpath("td[2]/a/@href").extract_first())

url2 = urljoin(response.url, site.xpath("td[3]/a/@href").extract_first()

if url.endswith("html"):
    request=scrapy.Request(url, callback=self.parse_details)
    request.meta['item']=item
    request.meta['url2']=url2
    yield request
elif url2.endswith("html"):
    request=scrapy.Request(url2, callback=self.parse_details2)
    request.meta['item']=item
    yield request

else:
    yield item


def parse_details(self, response):
    item = response.meta["item"]
    url2 = response.meta["url2"]
    item['About Me'] = response.xpath("//p[contains(text(), 'About Me')]/following-sibling::p/text()").extract()
    if url2:
        request=scrapy.Request(url2, callback=self.parse_details2)
        request.meta['item']=item
        yield request
    else:
        yield item

这段代码还没有被彻底测试过,所以在测试时注释
url2=response.meta(“url2”)TypeError时出现某种错误:“dict”对象不可调用
。可能是我们传递响应的方式。meta。应该是因为我们访问dict的方式。更新了我的代码并链接到了我的原始问题。在
url2=response.meta(“url2”)TypeError中出现某种错误:“dict”对象不可调用。可能是我们传递响应的方式。meta.应该是因为我们访问dict的方式。更新了我的代码并链接到我的原始问题。