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

如何用CSS选择器获取完整href链接?Scrapy爬虫提取问题

解决Scrapy提取完整href链接的问题

问题分析

你遇到的情况大概率是以下两种原因之一:

  1. CSS选择器格式错误:li.next a ::attr(href)里的空格会让选择器匹配<a>标签后代节点的href属性,而非<a>标签自身的属性,从而提取到错误内容
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.20 09:33:10