Scrapy:从奇怪的HTML标记中删除键/值对

时间:2015-09-05 10:41:49

标签: python web-scraping scrapy

我需要从以下网页中提取数据:

<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课程,但也许你们其中一个有想法?任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:2)

我没有设置测试,但是我试图找到强大的元素来获取密钥,然后使用下面的兄弟轴获取其后的值,而不是其他一路走来。

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