teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

状況を読み間違えてました。回答を訂正します

2017/05/30 01:05

投稿

shimizukawa
shimizukawa

スコア1847

answer CHANGED
@@ -1,11 +1,63 @@
1
+ 状況を読み間違えてました。回答を訂正しました
2
+
3
+ -------------
4
+
1
5
  ```Python
2
- print(json.loads(data)) # 確認用
6
+ script = soup.find_all("script", {"type": "text/javascript"})[1].get_text()
3
7
  ```
4
8
 
5
- が期待している処理と違ってそうです。
9
+ scriptに代入されているのは文字列ですよね
6
- ファイルの中身と見比べるのであれば、dumpsしたもをプリンするべきでょう
10
+ json.dumpsはPython「オブジェク」を「JSON文字列に」変換ます
7
- 以下よう書いてみてくだ
11
+ ため、Pythonの「文字列型のデータ」はJSONの「文字列型のデータ」変換れます
8
12
 
9
13
  ```Python
14
+ >>> print(json.dumps('"hello"'))
10
- print(data) # 確認用
15
+ "\"hello\""
11
- ```
16
+ ```
17
+
18
+ 提示されている例で言うと以下のようになります。
19
+
20
+ ```Python
21
+ >>> script = '{"activity_counts": null, "dummykey": "dummyvalue"}'
22
+ >>> print(json.dumps(script))
23
+ "{\"activity_counts\": null, \"dummykey\": \"dummyvalue\"}"
24
+ ```
25
+
26
+ これは、scriptに格納されているのが「すでにJSON表現の文字列」なのをさらにJSONに変換しているために上記のような結果になっています。
27
+ scriptが「すでにJSON」ならば、ここから2の対処方法が考えられます。
28
+
29
+ A: 特にPythonオブジェクトとして操作したいことがないのでそのまま出力する
30
+
31
+ ```Python
32
+ >>> with open("Output.json", "w") as f:
33
+ ... f.write(script)
34
+ ```
35
+
36
+ B: Pythonとして処理するために一旦Pythonのデータ型に変換する
37
+
38
+ ```Python
39
+ >>> data = json.loads(script)
40
+ >>> data
41
+ {'activity_counts': None, 'dummykey': 'dummyvalue'}
42
+ >>> print(json.dumps(data))
43
+ {"activity_counts": null, "dummykey": "dummyvalue"}
44
+ >>> # ここでdataに対してなにか操作をする
45
+ >>> with open("Output.json", "w") as f:
46
+ ... json.dump(data, f, indent=4)
47
+ ```
48
+
49
+ -------------------------
50
+
51
+ 以前の回答(scriptにPythonの文字列ではない型のデータが入っていると読み違えました)
52
+
53
+ > ```Python
54
+ > print(json.loads(data)) # 確認用
55
+ > ```
56
+ >
57
+ > これが期待している処理と違ってそうです。
58
+ > ファイルの中身と見比べるのであれば、dumpsしたものをプリントするべきでしょう。
59
+ > 以下のように書いてみてください。
60
+ >
61
+ > ```Python
62
+ > print(data) # 確認用
63
+ > ```