2017-09-05 9 views
2

저는 파이썬으로 초보자입니다. 현재는 파이썬으로 작은 프로젝트를 진행하고 있습니다. 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 줄 것으로 보인다 :

여기 내 코드입니다 잘못된 요청합니다. 인코딩하지 않으면 www.somethingsomething.org/o와 같은 URL이됩니다 : {....} 분명히 오류가 발생합니다. 내가 인코딩하면 모든 브래킷 변환 얻을 수 있기 때문에

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/en/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) 

, 당신은 단순히 requests을 사용할 수 있습니다, 그것은 urllib보다 훨씬 낫다. 당신이 구축 모든 문제를 통해 갈 이유

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

내가 볼 수 없습니다 :

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

코드에서 모든 변수에 관해서는, 그들은 아래와 같은 사전 구성 사전하지만 나는 틀릴 수 있습니다. 그러나 당신은 코드를 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 "을"true "} } VAR = json.dumps (데이터) = requests.post RESP (URL 데이터 = VAR) SAVEFILE = 개방 ("의 patents.txt", "w") saveFile.write (STR (RESP)) saveFile.close () 는 SAVEFILE은 = 개방 ("의 patents.txt", "w") saveFile.write (STR (RESP)) saveFile.close() 당신은 잘못 입력 한 – Max