2017-09-05 6 views
2

私はPythonの初心者で、現在はPythonで小さなプロジェクトに取り組んでいます。 私はpatentsview.orgの特許研究のためのダイナミックなスクリプトを作りたいと思っています。私は、動的URLのために右のスタートを切っ考えるPatentsview API Python 3.4

import urllib.parse 
import urllib.request 


#http://www.patentsview.org/api/patents/query?q={"_and": 
[{"inventor_last_name":author},{"_text_any":{"patent_title":[title]}}]}&o= 
{"matched_subentities_only": "true"} 
author = "Jobs" 
andreq = "_and" 
invln = "inventor_last_name" 
text = "_text_any" 
patent = "patent_title" 
match = "matched_subentities_only" 
true = "true" 
title = "computer" 
urlbasic = "http://www.patentsview.org/api/patents/query" 
patentall = {patent:title} 
textall = {text:patentall} 
invall = {invln:author} 
andall = invall.copy() 
andall.update(textall) 
valuesq = {andreq:andall} 
valuesqand = {andreq:andall} 
valuesq = {andreq:valuesqand} 
valueso = {match:true} 

######### 
url = "http://www.patentsview.org/api/patents/query" 
values = {"q":valuesq, 
      "o":valueso} 
print(values) 


data = urllib.parse.urlencode(values) 
print(data) 
############ 
data = data.encode("UTF-8") 
print(data) 
req = urllib.request.Request(url,data) 
resp = urllib.request.urlopen(req) 
respData = resp.read() 
saveFile = open("patents.txt", "w") 
saveFile.write(str(respData)) 
saveFile.close() 

- しかし、エンコーディングは私にHTTPエラー400与えるようだ:

は、ここに私のコードで不正なリクエストを。 エンコードしないと、URLはwww.somethingsomething.org/o:{....}のようになり、明らかにエラーが発生します。ここで はエラーです:私はエンコードした場合、すべてのブラケットが変換され得るので、

Traceback (most recent call last): 
    File "C:/Users/Max/PycharmProjects/KlayerValter/testen.py", line 38, in 
<module> 
resp = urllib.request.urlopen(req) 
File "C:\Python34\lib\urllib\request.py", line 161, in urlopen 
return opener.open(url, data, timeout) 
    File "C:\Python34\lib\urllib\request.py", line 469, in open 
response = meth(req, response) 
    File "C:\Python34\lib\urllib\request.py", line 579, in http_response 
'http', request, response, code, msg, hdrs) 
File "C:\Python34\lib\urllib\request.py", line 507, in error 
return self._call_chain(*args) 
    File "C:\Python34\lib\urllib\request.py", line 441, in _call_chain 
result = func(*args) 
File "C:\Python34\lib\urllib\request.py", line 587, in http_error_default 
raise HTTPError(req.full_url, code, msg, hdrs, fp) 
urllib.error.HTTPError: HTTP Error 400: Bad Request 

Process finished with exit code 1 

、私は同じエラーを取得します。 次のようにpatentsviewのAPIが動作します。私はすべてのライブラリ名を考え出す必要があった動的なプログラミングのための

http://www.patentsview.org/api/patents/query?q={"_or":[{"_and": 
[{"inventor_last_name":"Whitney"},{"_text_phrase":{"patent_title":"cotton 
gin"}}]},{"_and":[{"inventor_last_name":"Hopper"},{"_text_all": 
{"patent_title":"COBOL"}}]}]} 

。より良い解決策がある場合は、助けてください。

よろしくお願いいたします。

+2

提案:urllibと戦うのではなく[要求](http://docs.python-requests.org/ja/master/)ライブラリを使用してください。あなたの人生を楽にします。 –

答えて

1

apiはjsonデータを受け入れて返すので、投稿データをエンコードするにはjson.dumpsを使用する必要があります。次に、辞書が必要な場合、または単にファイルに書き込む場合は、json.loadsを応答に使用します。

from urllib.request import Request, urlopen 
import json 

url = "http://www.patentsview.org/api/patents/query" 
author = "Jobs" 
title = "computer" 
data = { 
    'q':{ 
     "_and":[ 
      {"inventor_last_name":author}, 
      {"_text_any":{"patent_title":title}} 
     ] 
    }, 
    'o':{"matched_subentities_only": "true"} 
} 
resp = urlopen(Request(url, json.dumps(data).encode())) 
data = resp.read() 
#data = json.loads(data) 

クリスチャンによって示唆されるように、あなたは単にそれがurllibよりもはるかに良いです、requestsを使用することができます。あなたのコード内のすべてのそれらの変数については

data = requests.post(url, json=data).json() 

、彼らは以下のような辞書作曲:あなたが構築するためにすべてのことトラブルを通過する理由

values = {"q":{andreq:{andreq:{invln:author, text:{patent:title}}}}, "o":{match:true}} 

を私は表示されません辞書が、私は間違っている可能性があります。しかし、あなたのコードは、引数としてauthortitleの関数で囲むことができます。


requestsの場合、データに json.dumpsを使用する必要はありません。 jsonパラメータを使用してください。応答コンテンツをファイルに保存する場合は、 contentまたは text属性を使用する必要があります。

import requests 

title = "computer" 
author = "Jobs" 
url = "http://www.patentsview.org/api/patents/query" 
data = { 
    "q":{ "_and":[ {"inventor_last_name":author}, {"_text_any":{"patent_title":title}}] }, 
    "o":{"matched_subentities_only":"true"} 
} 
resp = requests.post(url, json=data) 
with open("patents.txt", "w") as f: 
    f.write(resp.text) 
+0

"data = requests.post(url、json = data).json()" これは機能しません。 RESP = requests.post(URL、JSON =データ).json() SAVEFILE =オープン( "いるpatents.txt"、 "W") saveFile.write(STR(RESP)) saveFile.close() ValueError:期待値:行1列1(char 0) – Max

+0

'ValueError'例外は' .json() 'が応答のデコードに失敗したことを意味します。有効なデータを 'json'パラメータに渡してください。あなたの現在のコードであなたの投稿を更新する場合、私はそれを見てみることができます。 –

+0

インポート要求 輸入JSON タイトル= "コンピュータ" 著者= "ジョブズ" URL = "http://www.patentsview.org/api/patents/query" データ= { "Q":{ "そして ":[ {" inventor_last_name ":著者}、 {" _text_any ":{" patent_title ":タイトル}}] }、 "O":{" matched_subentities_only ":" 真 "} } VAR = json.dumps(データ) RESP = requests.post(URL、データ= VAR) SAVEFILE =オープン( "いるpatents.txt"、 "W") saveFile.write(STR(RESP)) saveFile.close( ) SAVEFILE =オープン( "いるpatents.txt"、 "W") saveFile.write(STR(RESP)) saveFile.close() – Max