如何使用Selenium与Scrapy抓取网页img标签的alt文本?
解决Scrapy抓取img标签alt属性中邮箱的问题
问题背景
我用Scrapy实现从CSV读取姓名,批量在UCLA目录搜索页搜索并抓取邮箱,但目标邮箱存储在img标签的alt属性里,现有代码无法获取该内容,求解决办法。
现有代码
import scrapy import csv class UCLADirectorySpider(scrapy.Spider): name = 'ucla_directory' start_urls = ['https://directory.ucla.edu/'] def start_requests(self): # 读取CSV中的姓名 with open('names.csv', 'r') as f: reader = csv.DictReader(f) for row in reader: name = row['name'] # 构造搜索请求 yield scrapy.FormRequest( url=self.start_urls[0], formdata={'q': name}, callback=self.parse_search_results ) def parse_search_results(self, response): # 现有无法获取邮箱的提取逻辑 for person in response.css('.person-result'): email = person.css('img.email-icon::text').get() # 错误写法:试图提取文本而非属性 yield { 'name': person.css('.name::text').get().strip(), 'email': email }
CSV示例
name John Doe Jane Smith
目标HTML结构
<div class="person-result"> <span class="name">John Doe</span> <img class="email-icon" src="/icons/email.png" alt="john.doe@ucla.edu"> </div>
解决方案
核心问题是你之前用了提取文本的语法::text去获取标签属性,Scrapy需要专门的语法提取属性值,两种可行写法:
1. CSS选择器提取alt属性
使用::attr(属性名)语法直接获取目标属性值:
email = person.css('img.email-icon::attr(alt)').get()
2. XPath选择器提取alt属性
如果偏好XPath,通过@属性名语法获取:
email = person.xpath('.//img[@class="email-icon"]/@alt').get()
修改后的完整解析方法
def parse_search_results(self, response): for person in response.css('.person-result'): name = person.css('.name::text').get().strip() email = person.css('img.email-icon::attr(alt)').get() # 处理可能的空值 email = email.strip() if email else None yield { 'name': name, 'email': email }
内容的提问来源于stack exchange,提问作者Tom
相关产品推荐
相关产品推荐

