2017-09-05 53 views
2

我是python的初學者,目前正在使用Python開發一個小項目。 我想爲patentview.org的專利研究構建一個動態腳本。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() 

我覺得我得到的動態URL正確的開始 - 但似乎編碼給我一個HTTP錯誤400:錯誤的請求。 如果我不編碼,該網址將像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

建議:使用[requests](http://docs.python-requests.org/en/master/)庫而不是用urllib打架 - 它會讓你的生活變得更容易。 –

回答

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) 

正如基督教的建議,你可以簡單地使用requests,它比urllib好得多。

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

至於在你的代碼所有這些變量,它們構成一個字典像下面這樣:

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

我不明白你爲什麼會去克服這些困難建造一本字典,但我可能是錯的。不過,你可以用authortitle作爲參數來包裝你的代碼。


使用 requests您不必在您的數據上使用 json.dumps,只需使用 json參數。如果要將響應內容保存到文件中,應使用 contenttext屬性。

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 「:標題}}] }, 」○「:{」 matched_subentities_only 「:」 真「} } VAR = json.dumps(data) resp = requests.post(url,data = var) saveFile = open(「patents.txt」,「w」) saveFile.write(str(resp)) saveFile.close ) saveFile的=打開( 「patents.txt」, 「W」) saveFile.write(STR(RESP)) saveFile.close() – Max