Scrapy爬虫无法获取DVLA车牌价格数据求助(原Selenium用户)
问题解决:Scrapy爬取DVLA车牌价格XPath失效问题
你的爬虫无法获取价格数据,核心问题出在XPath路径错误、语法错误,以及类属性引用问题上。结合你提供的HTML结构,下面是具体修正方案:
问题点分析
- XPath层级错误:目标HTML中
<a>和<p class="resultsstripprice">是同级节点,都属于div.resultsstrip容器,但你原代码里的div[@class="resultsstrip"]/a/p是在<a>标签内找<p>,和实际结构完全不符。 - XPath语法错误:
p[@class="resultsstripprice"/text()]缺少闭合方括号,正确写法应为p[@class="resultsstripprice"]/text()。 - 变量与路径引用错误:类属性
plate_num在parse方法中需用self.plate_num引用;循环内的XPath应使用相对路径(开头加.),否则会从根节点重新查找。
修正后的完整代码
import scrapy class QuotesSpider(scrapy.Spider): name = 'quotes' plate_num = "EA66LEE" start_urls = [ f'https://dvlaregistrations.dvla.gov.uk/search/results.html?search={plate_num}&action=index&pricefrom=0&priceto=&prefixmatches=¤tmatches=&limitprefix=&limitcurrent=&limitauction=&searched=true&openoption=&language=en&prefix2=Search&super=&super_pricefrom=&super_priceto=' ] def parse(self, response): # 遍历每个结果容器 for strip in response.xpath('//div[@class="resultsstrip"]'): # 提取并处理车牌文本(去除空格) plate_text = strip.xpath('.//a[@class="resultsstripplate plate"]/text()').get().strip() # 匹配目标车牌(兼容页面带空格的格式) if plate_text.replace(" ", "") == self.plate_num: # 从当前容器下提取价格 price = strip.xpath('.//p[@class="resultsstripprice"]/text()').get().strip() yield { 'plate number': self.plate_num, 'price': price }
关键修改说明
- 用
//div[@class="resultsstrip"]定位每个结果条容器,确保遍历所有可能的匹配项。 - 先验证车牌匹配性,避免爬取无关数据(页面可能返回多个相似车牌结果)。
- 采用相对路径
.//p[@class="resultsstripprice"]/text()从当前容器内查找价格,确保路径精准。 - 修正了类属性
plate_num的引用方式,添加self.前缀。
你可以先在Scrapy Shell中测试XPath:
scrapy shell "你的目标URL" # 测试价格提取XPath response.xpath('//div[@class="resultsstrip"]//p[@class="resultsstripprice"]/text()').get()
内容的提问来源于stack exchange,提问作者xlmaster
相关产品推荐
相关产品推荐

