Python 如何在scrapy中读取json文件中的行
我有一个json文件存储一些用户信息,包括Python 如何在scrapy中读取json文件中的行,python,json,scrapy,readlines,Python,Json,Scrapy,Readlines,我有一个json文件存储一些用户信息,包括id、name和url。json文件如下所示: {"link": "https://www.example.com/user1", "id": 1, "name": "user1"} {"link": "https://www.example.com/user1", "id": 2, "name": "user2"} 这个文件是由一只脏兮兮的蜘蛛写的。现在我想从json文件中读取URL,并抓取每个用户的网页。但是我无法从json文件加载数据 此时,我不
id
、name
和url
。json文件如下所示:
{"link": "https://www.example.com/user1", "id": 1, "name": "user1"}
{"link": "https://www.example.com/user1", "id": 2, "name": "user2"}
这个文件是由一只脏兮兮的蜘蛛写的。现在我想从json文件中读取URL,并抓取每个用户的网页。但是我无法从json文件加载数据
此时,我不知道如何获取这些URL。我想我应该先从json文件中读取这些行。我在Python shell中尝试了以下代码:
import json
f = open('links.jl')
line = json.load(f)
我收到以下错误消息:
Raise ValueError(errmsg("Extra data", s, end, len(s)))
ValueError: Extra data: line 2 column 1- line 138 column 497(char498-67908)
我在网上做了一些搜索。搜索表明json文件可能存在一些格式问题。但是json文件是使用scrapy管道创建并填充的。有人知道错误的原因吗?如何解决呢?对阅读网址有什么建议吗
非常感谢。如果您怀疑JSON文档可能存在格式错误,我建议将文档提交给。该工具将美化文档格式,并突出显示解析过程中遇到的任何结构或样式问题。我过去曾使用此工具在JSON文档生成器中查找多余的逗号和引号。我以前在设计糟糕的JSON API中发现过这种格式。这可能不是最好的解决方案,但这是一个小函数,用于将此类输出转换为包含列表中所有结果对象的dict
def json_parse(data):
d = data.strip().replace("\n\n", ",")
d = '{"result":[' + d + ']}'
return json.loads(d)
您可能需要根据分隔它们的新行数等因素对其进行一些修改。使用.Read()
读取文件,并对数据调用json\u parse
,您应该能够通过访问数据[“结果”]
来迭代所有内容
如果你能让你的抓取结果提供有效的JSON,那就更好了,但与此同时,类似的东西也能起作用。嗯。。。这个例外很有趣。。。我只是。。。把这个留在这里(没有保证或良心)
首先,JSON文件应该包含一个对象。在您的情况下,您有几个:
{"link": "https://www.domain.com/user1", "id": 1, "name": "user1"}
{"link": "https://www.domain.com/user1", "id": 2, "name": "user2"}
我会这样做:
Python 2.7.3 (default, Sep 26 2012, 21:51:14)
>>> import json
>>> inpt_json = """{"link": "https://www.domain.com/user1", "id": 1, "name": "user1"}
...
... {"link": "https://www.domain.com/user1", "id": 2, "name": "user2"}"""
>>> for line in inpt_json.splitlines():
... line = line.strip()
... if line:
... print json.loads(line)
...
{u'link': u'https://www.domain.com/user1', u'id': 1, u'name': u'user1'}
{u'link': u'https://www.domain.com/user1', u'id': 2, u'name': u'user2'}
>>>
因此,说“我有一个json文件存储一些用户信息…”是不正确的。Scrapy将输出存储为“一个包含json编码行的文件”导出器名称所示的json行 查看
scrapy.contrib.exporter
并查看JsonItemExporter
和JsonLinesItemExporter
这应该可以做到:
import json
lines = []
with open('links.jl', 'r') as f:
for line in f:
lines.append(json.loads(line))
嗯。。。提供的示例显然格式不正确:
json.loads({}{}')
给出了类似的错误。您确定每个json对象之间都有一个空行吗?你能确认一下吗,还有刮擦版。
import json
lines = []
with open('links.jl', 'r') as f:
for line in f:
lines.append(json.loads(line))