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

如何用Scrapy CSS选择器提取首个vcol标签内的指定数据

如何从多个相似标签结构中提取第一个标签内的数据?

需求:从以下HTML结构中,仅提取第一个vcol标签内的ITEM1、ITEM2、ITEM3、ITEM4,而非所有ITEM1-ITEM12。

目标HTML结构

<div class="main">

    <div class="vcol">
        <div class="cls">
            <ul class="ul_style">
                <li class="li_style"> <h3 class="item"> ITEM1 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM2 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM3 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM4 </h3></li>
            </ul>
        </div>
    </div>

    <div class="vcol">
        <div class="cls">
            <ul class="ul_style">
                <li class="li_style"> <h3 class="item"> ITEM5 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM6 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM7 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM8 </h3></li>
            </ul>
        </div>
    </div>

    <div class="vcol">
        <div class="cls">
            <ul class="ul_style">
                <li class="li_style"> <h3 class="item"> ITEM9 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM10 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM11 </h3></li>
                <li class="li_style"> <h3 class="item"> ITEM12 </h3></li>
            </ul>
        </div>
    </div>
    
</div>

当前问题代码

以下Scrapy代码会提取所有ITEM1至ITEM12,且存在标签选择错误(HTML中是h3,代码中用了h2):

for item in response.css('.vcol .cls .ul_style li'):
    item.css('h2 ::text').extract_first()

解决方法

方法1:CSS选择器限定第一个vcol

利用CSS的:first-child伪类定位第一个.vcol,再在其内部遍历目标元素,同时修正标签选择错误:

# 先定位第一个vcol容器
first_vcol = response.css('.vcol:first-child')
# 在第一个vcol内提取所有h3文本
for item in first_vcol.css('.cls .ul_style li h3.item ::text'):
    # 去除文本前后空格
    content = item.get().strip()
    print(content)

方法2:XPath索引定位第一个vcol

XPath的索引从1开始,直接通过(//div[@class="vcol"])[1]定位第一个目标容器:

# 直接用XPath提取第一个vcol内的所有目标文本
items = response.xpath('(//div[@class="vcol"])[1]//h3[@class="item"]/text()').getall()
# 处理每个文本,去除空格
clean_items = [text.strip() for text in items]
print(clean_items)

关键注意点

  • 必须先限定目标容器(第一个.vcol),否则选择器会匹配所有同类标签;
  • 原代码中错误使用h2选择器,需修正为HTML实际存在的h3标签。

内容的提问来源于stack exchange,提问作者Mah3sh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 17:58:33