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()
}
我需要从如下所示的网页中提取数据:
<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()
}