【发布时间】:2017-01-29 08:41:29
【问题描述】:
我对 Python 和 Scrapy 还很陌生,并且对于如何在 Scrapy 的帮助下创建嵌套 JSON 感到困惑。
在 XPath Helper 和一些谷歌搜索的帮助下,从 HTML 中选择我想要的元素并不是问题。然而,我不太确定我应该如何获得我想要的 JSON 结构。
我想要的 JSON 结构如下所示:
{"menu": {
"Monday": {
"alt1": "Item 1",
"alt2": "Item 2",
"alt3": "Item 3"
},
"Tuesday": {
"alt1": "Item 1",
"alt2": "Item 2",
"alt3": "Item 3"
}
}}
HTML 看起来像:
<ul>
<li class="title"><h2>Monday</h2></li>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
<ul>
<li class="title"><h2>Tuesday</h2></li>
<li>Item 1</li>
<li>Item 2</li>
<li>Item 3</li>
</ul>
我确实找到了https://stackoverflow.com/a/25096896/6856987,但是我无法调整它来满足我的需要。我将非常感谢您在正确的方向上推动我如何实现这一目标。
编辑:在 Padraic 提供的推动下,我设法离我想要完成的目标更近了一步。我想出了以下内容,这比我以前的情况略有改善。 JSON 仍然不是我想要的。
爬虫:
import scrapy
from dmoz.items import DmozItem
class DmozSpider(scrapy.Spider):
name = "dmoz"
start_urls = ['http://urlto.com']
def parse(self, response):
uls = response.xpath('//ul[position() >= 1 and position() < 6]')
item = DmozItem()
item['menu'] = {}
item['menu'] = {"restaurant": "name"}
for ul in uls:
item['menu']['restaurant']['dayOfWeek'] = ul.xpath("li/h2/text()").extract()
item['menu']['restaurant']['menuItem'] = ul.xpath("li/text()").extract()
yield item
生成的 JSON:
[
{
"menu":{
"dayOfWeek":[
"Monday"
],
"menuItem":[
"Item 1",
"Item 2",
"Item 3"
]
}
},
{
"menu":{
"dayOfWeek":[
"Tuesday"
],
"menuItem":[
"Item 1",
"Item 2",
"Item 3"
]
}
}
]
确实感觉我做错了一千零一件事,希望比我更聪明的人能指出正确的方法。
【问题讨论】:
-
我能看到
dmoz.items.DmozItem吗?