解决scrapy的无输出问题

本文讲述了作者在使用Scrapy爬虫时遇到的无输出问题,通过对比和测试发现问题是由于XPath表达式不正确导致的。经过逐步调试和修改XPath,最终成功获取到网页数据。同时,作者还提到了之前在使用requests和lxml时类似的问题,进一步确认了问题的根源在于XPath。解决方案是调整XPath表达式以匹配目标元素。
摘要由CSDN通过智能技术生成

scrapy问题解决

**

scrapy无输出问题解决

**

昨天跟着老师敲的时候,发现自己的scrapy无输出,心想:老师运行是对的,为什么我运行就是错的,于是在网络上疯狂寻找答案,最终还是没能解决,一觉之后,突然想到以前使用xpath时的错误。突然就想着试一下。果然,解决了问题。

使用requests时的类似错误

import requests
from lxml import etree
headers={
    'User-Agent':"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.164 Safari/537.36 Edg/91.0.864.71"
    }
url='https://map.baidu.com/'
response=requests.get(url=url,headers=headers).text
tree=etree.HTML(response)
page_text=tree.xpath('//*[@id="selCityPlaceListId"]/table/tbody/tr[1]/td[3]/text()')
print(page_text)

输出:[]
可以看出,这个是无输出的。

问题联想

由于使用scrapy和requests都出现了这样的错误,那么会不会是xpath的错误。于是我修改了一下代码,一步一步的检测,最终,问题出现在xpath表达式上面。
初始代码:

import scrapy


class QiubiaSpider(scrapy.Spider):
    name = 'qiubai'
    allowed_domains = ["https://www.qiushibaike.com/text/"]
    start_urls = ["https://www.qiushibaike.com/text/"]

    def parse(self, response):
        #文件数据解析。
        response.selector.register_namespace('div', 'https://www.qiushibaike.com/text/')
        div_list=response.xpath('//*[@id="content-left"]/div')
        for div in div_list:
            #extract可以将Selector中的data对象提取出来
            name=div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            #如果列表调用了extract,那么就会把里面所有的selector的data参数所对应的字符串取出来
            content=div.xpath('./a[1]/div/span//text()').extract()
            print(name,content)
            break
            

初始代码的输出:
请添加图片描述
可以看到没有任何输出。

既然想到了问题出在xpath上,于是,我开始不断的print测试xpath代码块。

import scrapy


class QiubiaSpider(scrapy.Spider):
    name = 'qiubai'
    allowed_domains = ["https://www.qiushibaike.com/text/"]
    start_urls = ["https://www.qiushibaike.com/text/"]

    def parse(self, response):
        #文件数据解析。
        response.selector.register_namespace('div', 'https://www.qiushibaike.com/text/')
        div_list=response.xpath('//*[@id="content-left"]')
        print(div_list)
        #for div in div_list:
            #extract可以将Selector中的data对象提取出来
            #name=div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            #如果列表调用了extract,那么就会把里面所有的selector的data参数所对应的字符串取出来
            #content=div.xpath('./a[1]/div/span//text()').extract()
            #print(name,content)

输出果然是一个空列表:
请添加图片描述
测试是不是网站原因导致xpath表达式提取不到:

import scrapy


class QiubiaSpider(scrapy.Spider):
    name = 'qiubai'
    allowed_domains = ["https://www.qiushibaike.com/text/"]
    start_urls = ["https://www.qiushibaike.com/text/"]

    def parse(self, response):
        #文件数据解析。
        response.selector.register_namespace('div', 'https://www.qiushibaike.com/text/')
        div_list=response.xpath('/dvi')
        print(div_list)
        #for div in div_list:
            #extract可以将Selector中的data对象提取出来
            #name=div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            #如果列表调用了extract,那么就会把里面所有的selector的data参数所对应的字符串取出来
            #content=div.xpath('./a[1]/div/span//text()').extract()
            #print(name,content)
            

果然不是网站原因:
请添加图片描述
那么,修改xpath表达式,解决问题:

import scrapy


class QiubiaSpider(scrapy.Spider):
    name = 'qiubai'
    allowed_domains = ["https://www.qiushibaike.com/text/"]
    start_urls = ["https://www.qiushibaike.com/text/"]

    def parse(self, response):
        #文件数据解析。
        response.selector.register_namespace('div', 'https://www.qiushibaike.com/text/')
        div_list=response.xpath('/html/body/div[1]/div/div[2]/div[2]/a[1]/div/span/text()').extract()
        print(div_list)
        #for div in div_list:
            #extract可以将Selector中的data对象提取出来
            #name=div.xpath('./div[1]/a[2]/h2/text()')[0].extract()
            #如果列表调用了extract,那么就会把里面所有的selector的data参数所对应的字符串取出来
            #content=div.xpath('./a[1]/div/span//text()').extract()
            #print(name,content)
            

请添加图片描述
这里是蜘蛛云,我是南风,欢迎评论斧正。

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 7
    评论
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值