Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在scrapy中读取json文件中的行_Python_Json_Scrapy_Readlines - Fatal编程技术网

Python 如何在scrapy中读取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文件加载数据 此时,我不

我有一个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))