Python中Scrapy利用XPath无法获取img标签完整src的解决方法

主要 py 文件码源:
import scrapy
from myfirst.items import MyfirstItem


class TestSpider(scrapy.Spider):
name = ‘test’
part_url = ‘https://www.qiushibaike.com/imgrank/
page = ‘page/’

def start_requests(self):
for page_number in range(1, 2, 1):
if page_number == 1:
yield self.make_requests_from_url(self.part_url)
else:
yield self.make_requests_from_url(self.part_url + self.page + str(page_number) + “/”)

def parse(self, response):
item = MyfirstItem()
item[“img_url”] = response.xpath("//div[@class=‘thumb’]/a/img/@src")
for url in item[“img_url”]:
print(url)


url 打印出来:
<Selector xpath="//div[@class=‘thumb’]/a/img/@src" data=’//pic.qiushibaike.com/system/pictures/11’>
实际地址比 data 的要长
Python中Scrapy利用XPath无法获取img标签完整src的解决方法


9 回复

太长时间没用不太记得了
试试 response.xpath("//div[@class=‘thumb’]/a/img/@src").extract()


这个问题我遇到过。Scrapy用XPath提取img的src时,如果网站用的是相对路径或者懒加载,确实会拿不到完整URL。核心是要用response.urljoin()处理相对路径,还要注意那些data-src之类的属性。

看这个例子:

import scrapy

class ImageSpider(scrapy.Spider):
    name = 'image_spider'
    start_urls = ['http://example.com']
    
    def parse(self, response):
        # 方法1:处理相对路径
        img_urls = response.xpath('//img/@src').getall()
        for img_url in img_urls:
            full_url = response.urljoin(img_url)  # 关键在这里
            yield {'image_url': full_url}
        
        # 方法2:处理懒加载(比如data-src)
        lazy_urls = response.xpath('//img/@data-src').getall()
        for lazy_url in lazy_urls:
            full_url = response.urljoin(lazy_url)
            yield {'lazy_image_url': full_url}
        
        # 方法3:同时检查多个可能的属性
        for img in response.xpath('//img'):
            src = img.xpath('@src').get()
            data_src = img.xpath('@data-src').get()
            srcset = img.xpath('@srcset').get()
            
            # 优先级:src > data-src > srcset
            target_url = src or data_src or (srcset.split(',')[0].split()[0] if srcset else None)
            
            if target_url:
                full_url = response.urljoin(target_url)
                yield {'final_url': full_url}

主要就这几点:

  1. 绝对要用response.urljoin()把相对路径转成完整URL
  2. 有些网站用data-src做懒加载,得单独处理
  3. srcset属性可能有多个图片,取第一个就行
  4. 实在不行就上正则或者用urllib.parse.urljoin()

总结:记得用urljoin处理相对路径。

是的,谢谢,我来查查 extract()

去掉最前面两个斜杠。。

print (url[2:])

看错了。。

XPATH

最简单的方法,f12,在 elements 右键,然后找到 copy,在找到 copy xpath

response.xpath("//div[@class=‘thumb’]/a/img/@src") .extract_first()

楼主最后怎么解决的呢?

回到顶部