如何用CSS选择器获取完整href链接?Scrapy爬虫提取问题
解决Scrapy提取完整href链接的问题
问题分析
你遇到的情况大概率是以下两种原因之一:
- CSS选择器格式错误:
li.next a ::attr(href)里的空格会让选择器匹配<a>标签后代节点的href属性,而非<a>标签自身的属性,从而提取到错误内容 - HTML中href本身是相对路径:比如
<a>标签的href只有?page=2,而非完整的drugs-all-medicines?page=2
针对性解决方案
方案1:修正CSS选择器
去掉<a>和::attr(href)之间的空格,直接写li.next a::attr(href),这样才能准确提取<a>标签自身的href属性:
# 在Scrapy Shell中测试正确的选择器 response.css('li.next a::attr(href)').get()
如果HTML里的href本身就是完整的drugs-all-medicines?page=2,修正选择器后就能拿到正确内容。
方案2:拼接完整URL(适配相对路径)
如果HTML里的href是相对路径(比如只有?page=2),用Scrapy内置的response.urljoin()方法把相对路径和当前页面的URL拼接成完整链接:
# 爬虫代码中的写法 next_href = response.css('li.next a::attr(href)').get() if next_href: full_next_url = response.urljoin(next_href) # 之后可以用full_next_url发起请求
这个方法会自动处理各种相对路径场景,比如带参数的?page=2、带斜杠的/drugs-all-medicines?page=2等,无需手动拼接基础路径。
方案3:用XPath选择器兜底
如果CSS选择器还是有问题,换成XPath选择器试试,有时候XPath在属性提取上更直观:
# Scrapy Shell中测试XPath response.xpath('//li[contains(@class, "next")]/a/@href').get()
代码中同样可以配合response.urljoin()使用:
next_href = response.xpath('//li[contains(@class, "next")]/a/@href').get() full_next_url = response.urljoin(next_href) if next_href else None
爬虫代码示例修正
假设你的原代码是这样:
import scrapy class MedicinesSpider(scrapy.Spider): name = 'medicines' start_urls = ['http://example.com/drugs-all-medicines'] def parse(self, response): # 这里写你的数据提取逻辑 # 原错误写法 next_page = response.css('li.next a ::attr(href)').get() if next_page: yield scrapy.Request(next_page) # 修正后的写法 next_page_href = response.css('li.next a::attr(href)').get() if next_page_href: full_next_url = response.urljoin(next_page_href) yield scrapy.Request(full_next_url)
内容的提问来源于stack exchange,提问作者Lucyfer
相关产品推荐
相关产品推荐

