Scrapy:从奇怪的 HTML 标记中刮取 key/value 对

Scrapy: scrape key/value pairs from weird HTML markup

我需要从如下所示的网页中提取数据:

<div>
    <div>
        <p><strong>key1</strong>value1</p>
        <p><strong>key2</strong>value2</p>
        <p><strong>key3</strong>value3</p>
        <p><strong>key4</strong>value4</p>
    </div>
</div>

获得 JSON 文件会很棒:

{"key1":"value1", "key2":"value2", "key3":"value3", "key4":"value4"}

因为你猜怎么着?有时,网页看起来像:

<div>
    <div>
        <p><strong>key1</strong>value1</p>
        <p><strong>key3</strong>value3</p>
        <p><strong>key2</strong>value2</p>
        <p><strong>key4</strong>value4</p>
    </div>
</div>

或者:

<div>
    <div>
        <p><strong>key1</strong>value1</p>
        <p><strong>key4</strong>value4</p>
    </div>
</div>

(别问了。我不知道为什么他们没有正确序列化他们的数据,或者使用这种荒谬的标记。我只想抓取数据并完成它。)

我过去使用 Scrapy 取得了巨大的成功,但仅限于具有清晰标记和明确定义 类 或 ID 的非常小的项目。这显然更难,而且我似乎无法绕过它。我对 Python 几乎一无所知这一事实无济于事。

我试过类似的方法,但显然行不通:

def parse(self, response):
        values = response.xpath('//div[2]/p/node()[not(self::strong)]')
        for value in values:
            yield {
                value.xpath('../strong/text()').extract(): value.extract()
            }

我试过用索引做事,但选择器不支持索引。我可以尝试记住我的初学者 CS 类 关于函数等的内容,但也许你们中有人有想法?任何帮助将不胜感激。

我没有要测试的设置,但我会尝试找到强元素来获取键,然后使用以下同级轴来获取跟随它的值,而不是反过来.

def parse(self, response):
    keys = response.xpath('//div[2]/p/strong')
    for key in keys:
        yield {
            key.extract(): key.xpath('following-sibling::node()').extract()
        }