scrapy 从嵌套类中的嵌套 div 中提取文本

问题描述 投票:0回答:1

总的来说,我对 scrapy 和网络抓取非常陌生,我一直在学习教程,并想扩展一下,看看我能做什么。

我有一些来自网站的内容,我想抓取其中的三列详细信息。我想从每一列中提取详细信息。

我不知道如何从列中获取每个标题的数据。例如,如果我想将 body 类型存储在名为 body_type 的 scrapy 字段中,如何获取文本“Coachbuilt”?另一件事是,我想要的内容可能并不总是位于表中的同一位置,但始终会以正确的名称进行。 EG Transmission 是第二列的第一个字段,数据为手动,但可能并不总是存在,可能在第一列。

我已经使用

response.css(".single-product__left-desc__specification").get()
获取整个顶级 div,然后从那里我可以使用
firstcol=response.css(".single-product__left-desc__specification .first-col")
获取第一列,然后使用
fields=firstcol.css(".col-4 strong::text").getall()
获取第 4 行内容,但这给了我第一行,我然后可以执行类似values=firstcol.css(".col-8::text").getall() 的操作,但这并没有给我所有数据,而且我不确定如何将字段与值匹配以创建我想要的领域。有人能指出我正确的方向吗?

这是 html 片段。

<div class="single-product__left-desc__specification">
    <div class="row">
        <div class="first-col col-md-6 col-lg-5 p-0">
            <div class="row">
                <div class="col-4"><strong>Body Type</strong></div>
                <div class="col-8 text-left pl-0">Coachbuilt</div>
            </div>
            <div class="row">
                <div class="col-4 pr-0"><strong>Make</strong></div>
                <div class="col-8 text-left pl-0">Adria</div>
            </div>
            <div class="row">
                <div class="col-4"><strong>Range</strong></div>
                <div class="col-8 text-left pl-0">Matrix 670 SLT Supreme </div>
            </div>
            <div class="row">
                <div class="col-4"><strong>Reg Year</strong></div>
                <div class="col-8 text-left pl-0 product-single__taxonomy-reg">2018</div>
            </div>
            <div class="row">
                <div class="col-4"><strong>Layout</strong></div>
                <div class="col-8 text-left pl-0">End Washroom</div>
            </div>
        </div>
        <div class="col-md-6 col-lg-7 p-0">
            <div class="row">
                <div class="col-md-6 col-lg-7 p-0">
                    <div class="row">
                        <div class="col-6"><strong>Transmission</strong></div>
                        <div class="col-6 text-left pl-0">Manual</div>
                    </div>
                    <div class="row">
                        <div class="col-6"><strong>Drive</strong></div>
                        <div class="col-6 text-left pl-0">RHD</div>
                    </div>
                    <div class="row">
                        <div class="col-6"><strong>Engine Size</strong></div>
                        <div class="col-6 text-left pl-0">2.3</div>
                    </div>
                    <div class="row">
                        <div class="col-6"><strong>Engine Power</strong></div>
                        <div class="col-6 text-left pl-0">143bhp</div>
                    </div>
                    <div class="row">
                        <div class="col-6"><strong>Bed Type</strong></div>
                        <div class="col-6 text-left pl-0">Single Beds</div>
                    </div>
                </div>
                <div class="last-col col-md-6 col-lg-5 p-0">
                    <div class="row">
                        <div class="col-6"><strong>Mileage</strong></div>
                        <div class="col-6 text-left pl-0">
                            <div class="product-single__taxonomy">11111</div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-6"><strong>Berths</strong></div>
                        <div class="col-6 text-left pl-0">
                            <div class="product-single__taxonomy">4</div>
                        </div>
                    </div>
                    <div class="row">
                        <div class="col-6"><strong>Weight</strong></div>
                        <div class="col-6 text-left pl-0">3800</div>
                    </div>
                    <div class="row">
                        <div class="col-6"><strong>Seatbelts</strong></div>
                        <div class="col-6 text-left pl-0">4</div>
                    </div>
                </div>
            </div>
        </div>
    </div>
</div>

理想情况下,如果有人可以指出文档、视频、指南来帮助我解决这个问题,那就太棒了!

非常感谢

scrapy
1个回答
0
投票

解决方案应如下所示

result = {}
for row in response.css('.single-product__left-desc__specification .row .row'):
    name = row.css('strong::text').get('')
    value = ''.join([c.strip('\n ') for c in row.css('.pl-0').css('*::text').getall()])
    result[name] = value

for k, v in result.items():
    print(f"{k} : {v}")

所以一般来说我做了..复合CSS查询

.single-product__left-desc__specification .row .row
并且对于每个结果(在
for
循环内)-我对字段名称(在
strong
标签内)及其值进行了单独的查询(要获得的复杂内容)其他栏的所有文本)。

输出 - 具有以下内容的词典:

Body Type : Coachbuilt
Make : Adria
Range : Matrix 670 SLT Supreme
Reg Year : 2018
Layout : End Washroom
Transmission : Manual
Drive : RHD
Engine Size : 2.3
Engine Power : 143bhp
Bed Type : Single Beds
Mileage : 11111
Berths : 4
Weight : 3800
Seatbelts : 4

在 scrapy 字典中也可以通过在解析方法中添加

yield result
作为项目返回

© www.soinside.com 2019 - 2024. All rights reserved.