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
相关产品推荐
相关产品推荐

