Python中如何使用Scrapy获取元素的class属性
当前的 selector 已找到元素 a 比如
<tr class="class1">
<td class="class2"></td>
<td class="class3"></td>
</tr>
现在希望输出 tr 这个元素的 class,也就是'class1' 但是如果使用 a.css('::attr(class)'),那么结果是['class1','class2','class3']
如果使用 a.css('::attr(class)')[0],直接输出第一个,那么当元素为下面这样时 结果是'class2',但是实际上需要的结果是 null
<tr>
<td class="class2"></td>
<td class="class3"></td>
</tr>
请问怎样才能保证得到 tr 元素 class 的值
Python中如何使用Scrapy获取元素的class属性
3 回复
import scrapy
class MySpider(scrapy.Spider):
name = 'class_spider'
start_urls = ['http://example.com']
def parse(self, response):
# 方法1: 使用CSS选择器获取class属性
# 获取单个元素的class
single_class = response.css('div.my-class::attr(class)').get()
# 获取多个元素的class列表
class_list = response.css('div.item::attr(class)').getall()
# 方法2: 使用XPath获取class属性
# 获取单个元素的class
single_class_xpath = response.xpath('//div[@class="my-class"]/@class').get()
# 获取多个元素的class列表
class_list_xpath = response.xpath('//div[contains(@class, "item")]/@class').getall()
# 方法3: 获取元素对象后提取class
for element in response.css('div'):
# 直接获取class属性
class_attr = element.attrib.get('class')
# 或者使用extract_first()
class_attr2 = element.css('::attr(class)').extract_first()
if class_attr:
yield {
'class': class_attr,
'text': element.css('::text').get()
}
# 如果要处理多个class的情况(元素有多个class名)
def parse_detailed(self, response):
for element in response.css('div[class]'):
class_str = element.attrib['class']
# 将class字符串分割成列表
class_list = class_str.split()
yield {
'element': element.get(),
'all_classes': class_str,
'class_list': class_list,
'has_active': 'active' in class_list
}
核心要点:
- CSS选择器:用
::attr(class)获取class属性 - XPath:用
/@class获取class属性 - 属性访问:通过
element.attrib.get('class')直接访问 - 多个class处理:用
split()分割class字符串
一句话建议: 根据页面结构选择CSS或XPath,需要处理多个class时记得分割字符串。
xpath //tr/@class
非常感谢

