我需要从以下网页中提取数据:
<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课程,但也许你们其中一个有想法?任何帮助将不胜感激。
答案 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()
}