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
        }

核心要点:

  1. CSS选择器:用::attr(class)获取class属性
  2. XPath:用/@class获取class属性
  3. 属性访问:通过element.attrib.get('class')直接访问
  4. 多个class处理:用split()分割class字符串

一句话建议: 根据页面结构选择CSS或XPath,需要处理多个class时记得分割字符串。


xpath //tr/@class

非常感谢

回到顶部