首页 > 解决方案 > 匹配未嵌套的元素(scrapy)

问题描述

我对 Python 还很陌生,第一次尝试使用scrapy,但我一直坚持对未嵌套的 HTML 元素进行分组。

所以基本上两个 HTML 元素每次都重复,并且属于一起。由于 UL 没有嵌套在 H2 中,我不知道如何将它们配对。

在此处输入图像描述

我想要实现的是使用以下结构化数据获取日期和漏洞列表:

March 10, 2020 (Date)
.MFSA 2020-10 (UID) 
..Level high (Severity)
../en-US/security/advisories/mfsa2020-10/ (Url)
..Security Vulnerabilities fixed in Thunderbird 68.6 (Description)
.MFSA 2020-09 (UID) 
..Level high (Severity)
../en-US/security/advisories/mfsa2020-09/ (Url)
..Security Vulnerabilities fixed in Firefox ESR 68.6 (Description)

到目前为止,我所做的是使用以下方法手动刮擦外壳:

scrapy shell 'https://www.mozilla.org/en-US/security/advisories/' 

>>>response.css('article.mzp-c-article h2::text').get()
'March 10, 2020'

>>>response.css('article.mzp-c-article a::attr(href)').get()
'/en-US/security/advisories/mfsa2020-10/'

>>>response.css('li.level-item span::attr(class)')[4].get() # first few results are severity index
'level critical'

>>>response.css('li.level-item a::text').get()
' Security Vulnerabilities fixed in Thunderbird 68.6'

问题是我无法以这种方式将 Uid、Severity、URL 和 Description 与 Date 匹配。

我曾想过使用 'response.css('article.mzp-c-article ul').getall()[$n]' 收集每个 ul 的所有数据并使用 RE 解构所需的数据,但这感觉就像是 PITA . 谁能指出我正确的方向?

一种

标签: pythonscrapy

解决方案


在这种情况下,您必须使用 xpath 而不是 css。

response.xpath('//article//h2::following-sibling/ul/li/a/@href').extract()

我可能拼错了一些 html,但总的来说你应该看看https://www.w3schools.com/xml/xpath_axes.asp


推荐阅读