You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Scrapy爬虫返回None但XPath正确,求问题排查

解决Scrapy爬虫无法获取影片名称的问题

嘿,刚看了你的代码,问题其实挺明显的——你的XPath用了绝对路径,而不是相对路径,这就是为什么返回空列表或者None的原因!

核心错误分析

你在循环里写的film.xpath('/td/div/b/text()'),这里的/td是从HTML根节点开始查找<td>元素,而不是在当前遍历的<tr>节点(也就是film变量)下面找。所以每一次循环都在整个页面里找根节点下的<td>,自然找不到对应tr里的内容,返回空列表。

修改方案

只需要把XPath改成相对路径就好,在路径开头加个.,表示从当前节点(也就是每个film对应的<tr>)开始查找:

import scrapy
class finderSpider(scrapy.Spider):
    name = 'finderSpider'
    start_urls = ['https://www.finder.com/uk/netflix-movies']
    def parse(self,response):
        # 加上tbody更精准,避免爬取到表头的tr
        for film in response.xpath('//tbody/tr'):
            yield {
                # 用相对路径从当前tr节点下查找目标内容
                'name': film.xpath('./td/div/b/text()').get()  # get()返回单个字符串,空结果返回None
                # 也可以用extract_first(),和get()效果一致,Scrapy新版本更推荐get()
                # 'name': film.xpath('./td/div/b/text()').extract_first()
            }

额外优化建议

  • 用get()代替extract():extract()会返回所有匹配结果的列表,而get()只返回第一个匹配的字符串,更适合获取单个影片名称,空结果时返回None而非空列表,数据格式更整洁。
  • 精准定位内容行:原代码//tr会包含表头的tr,改成//tbody/tr可以只遍历表格里的内容行,避免爬取到表头的无效数据。

你可以再用XPath Helper验证一下:选中某个内容行的<tr>后,输入./td/div/b/text(),应该就能看到对应的影片名称啦~

内容的提问来源于stack exchange,提问作者lhh13

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.07 13:38:12