2401_86192092 2024-07-23 21:52 采纳率: 0%
浏览 14

学习scrapy,发现列表返回为空

问题遇到的现象和发生背景
遇到的现象和发生背景,请写出第一个错误信息
import scrapy


class ItcastSpider(scrapy.Spider):
    name = "itcast"
    allowed_domains = ["itcast.cn/"]
    start_urls = ["https://python.itheima.com/?pythonzly#navjxtd"]

    def parse(self, response):
        # with open("itcast.html", "wb")as f:
        #     f.write(response.body)

        node_list = response.xpath('//div[@class="li_txt"]')

        print(node_list)
        for node in node_list:
            temp = {}
            temp['name'] = node.xpath('./h3/text()').extract()
            temp['experience'] = node.xpath('./p/text()').extract()
            yield temp
        print(response.status)

我觉得我的xpath路径正确的

用代码块功能插入代码,请勿粘贴截图。 不用代码块回答率下降 50%

请求帮助

运行结果及详细报错内容
我的解答思路和尝试过的方法,不写自己思路的,回答率下降 60%
我想要达到的结果,如果你需要快速回答,请尝试 “付费悬赏”
  • 写回答

2条回答 默认 最新

  • 阿里嘎多学长 2024-07-23 21:52
    关注

    以下内容由AIGC及阿里嘎多学长共同生成、有用望采纳:


    在使用Scrapy进行网页爬取时,遇到列表返回为空的问题,通常有以下几种可能的原因:

    1. Xpath表达式错误:尽管你确信Xpath路径是正确的,但有时候网页的微小变化,比如类名或标签的更改,都会导致Xpath失效。建议再次检查Xpath表达式是否与网页的当前结构相匹配。

    2. 网页加载问题:如果网页是通过JavaScript动态加载内容,Scrapy可能无法直接获取到这些内容。可以尝试使用response.css()结合response.xpath()来提取数据,或者使用Selenium等工具来处理动态加载的内容。

    3. 请求被拦截或响应不正确:确保你的请求没有被服务器拦截,并且响应的状态码是200。可以通过打印response.status来检查这一点。

    4. 编码问题:确保网页的编码与你的爬虫编码设置一致,否则可能会因为编码问题导致解析错误。

    5. Scrapy设置问题:检查Scrapy的设置,比如USER_AGENT等,确保你的请求看起来像是来自一个正常的浏览器。

    针对你的问题,以下是一些可能的解决步骤:

    • 验证Xpath:使用浏览器的开发者工具来检查元素的Xpath是否正确。
    • 检查响应:打印response.text来查看网页的HTML内容,确保Scrapy获取到了正确的页面内容。
    • 使用response.css():如果response.xpath()不起作用,尝试使用response.css()来选择元素。
    • 检查日志:查看Scrapy的日志输出,可能会有有用的错误信息或警告。
    • 使用代理或更改请求头:如果怀疑请求被拦截,尝试使用代理或更改请求头。

    下面是一些示例代码,展示如何使用response.css()和打印响应内容:

    import scrapy
    
    class ItcastSpider(scrapy.Spider):
        name = "itcast"
        allowed_domains = ["itheima.com"]  # 确保域名正确
        start_urls = ["https://python.itheima.com/?pythonzly#navjxtd"]
    
        def parse(self, response):
            # 打印响应状态码
            print(response.status)
    
            # 打印响应内容
            print(response.text)
    
            # 使用CSS选择器尝试提取数据
            node_list = response.css('div.li_txt')
    
            for node in node_list:
                temp = {
                    'name': node.css('h3::text').get(),
                    'experience': node.css('p::text').get()
                }
                yield temp
    

    请注意,上面的代码中我将allowed_domains中的域名更正为"itheima.com",因为原始代码中的域名似乎有误。同时,我使用了response.css()来尝试提取数据。

    最后,如果你认为需要快速获得回答,可以考虑使用“付费悬赏”的方式,但这并不是必需的,因为社区中有很多乐于助人的开发者。希望这些建议能帮助你解决问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 7月23日