3

idnameおよびを含むいくつかのユーザー情報を格納するjsonファイルがありurlます。json ファイルは次のようになります。

{"link": "https://www.example.com/user1", "id": 1, "name": "user1"}
{"link": "https://www.example.com/user1", "id": 2, "name": "user2"}

このファイルは、スクレイピー スパイダーによって作成されました。ここで、json ファイルから URL を読み取り、各ユーザーの Web ページをスクレイピングしたいと考えています。しかし、jsonファイルからデータをロードできません。

現時点では、これらの URL を取得する方法がわかりません。最初にjsonファイルから行を読むべきだと思います。Pythonシェルで次のコードを試しました:

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 パイプラインを使用して作成され、項目が取り込まれました。エラーの原因を知っている人はいますか? そして、それを解決する方法は?URL の読み取りに関する提案はありますか?

どうもありがとう。

4

5 に答える 5

7

エクスポーター名が示すように、これらは 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))
于 2013-04-16T19:30:11.027 に答える
1

うーん...その例外は興味深いです...私はただ...これをここに残します(保証または良心なしで)。

import json
import re

parse_err = re.compile(
    r'Extra data: line \d+ column \d+'
    r' - line \d+ column \d+'
    r' \(char (\d*).*')

def recover_bad_json(data):
    while data:
        try:
            yield json.loads(data)
            return
        except ValueError, e:
            char = parse_err.match(e.args[0]).group(1)
            maybe_data, data = data[:int(char)], data[int(char):]
            yield json.loads(maybe_data)

CORPUS = r'''{"link": "https://www.domain.com/user1", "id": 1, "name": "user1"}

{"link": "https://www.domain.com/user1", "id": 2, "name": "user2"}
'''

gen_recovered = recover_bad_json(CORPUS)

print gen_recovered.next()
print gen_recovered.next()
print gen_recovered.next()
于 2012-12-24T06:25:53.693 に答える
0

AFAIK、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でエンコードされた行を含むファイル」として保存します

于 2012-12-24T08:12:19.100 に答える
0

JSON ドキュメントの形式が正しくない疑いがある場合は、ドキュメントをJSONLintに送信することをお勧めします。このツールは、ドキュメントの書式設定をきれいにし、解析中に発生した構造またはスタイルの問題を強調表示します。過去にこのツールを使用して、JSON ドキュメント ジェネレーターで余分なコンマや壊れた引用符を見つけました。

于 2012-12-24T05:23:26.193 に答える
0

この種の書式設定は、設計が不十分な JSON API で以前に発見されました。これは最善の解決策ではないかもしれませんが、これは、この種の出力をリスト内のすべての結果オブジェクトを含む dict に変換するために使用する小さな関数です。

def json_parse(data):
    d = data.strip().replace("\n\n", ",")
    d = '{"result":[' + d + ']}'
    return json.loads(d)

それらを区切る改行の数などによっては、少しいじる必要があるかもしれません。でファイルを読み取り、データ.read()を呼び出すとjson_parse、にアクセスしてすべてを反復処理できるはずですdata["results"]

スクレイピングの結果が有効な JSON を提供できればもっと良いのですが、当面はこのような方法でうまくいく可能性があります。

于 2012-12-24T05:27:03.150 に答える