'How to search for books that have spaces in their title using Google books API

When i search for books with a single name(e.g bluets) my code works fine, but when I search for books that have two names or spaces (e.g white whale) I got an error(jinja2 synatx) how do I solve this error?

   @app.route("/book", methods["GET", "POST"])
   def get_books():
    api_key = 
    os.environ.get("API_KEY") 
    if request.method == "POST":
     book = request.form.get("book")    
     url =f"https://www.googleapis.com/books/v1/volumes?q={book}:keyes&key={api_key}" 
     response =urllib.request.urlopen(url) 
     data = response.read() 
     jsondata = json.loads(data) 
    return render_template ("book.html", books=jsondata["items"]

I tried to search for similar cases, and just found one solution, but I didn't understand it Here is my error message http.client.InvalidURL

http.client.InvalidURL: URL can't contain control characters. '/books/v1/volumes?q=white whale:keyes&key=AIzaSyDtjvhKOniHFwkIcz7-720bgtnubagFxS8' (found at least ' ')



Solution 1:[1]

Some chars in url need to be encoded - in your situation you have to use + or %20 instead of space.

This url has %20 instead of space and it works for me. If I use + then it also works

import urllib.request
import json

url = 'https://www.googleapis.com/books/v1/volumes?q=white%20whale:keyes&key=AIzaSyDtjvhKOniHFwkIcz7-720bgtnubagFxS8'
#url = 'https://www.googleapis.com/books/v1/volumes?q=white+whale:keyes&key=AIzaSyDtjvhKOniHFwkIcz7-720bgtnubagFxS8'

response = urllib.request.urlopen(url)
text = response.read()
data = json.loads(text)

print(data)

With requests you don't even have to do it manually because it does it automatically

import requests

url = 'https://www.googleapis.com/books/v1/volumes?q=white whale:keyes&key=AIzaSyDtjvhKOniHFwkIcz7-720bgtnubagFxS8'

r = requests.get(url)
data = r.json()

print(data)

You may use urllib.parse.urlencode() to make sure all chars are correctly encoded.

import urllib.request
import json

payload = {
    'q': 'white whale:keyes',
    'key': 'AIzaSyDtjvhKOniHFwkIcz7-720bgtnubagFxS8',
}

query = urllib.parse.urlencode(payload)

url = 'https://www.googleapis.com/books/v1/volumes?' + query

response = urllib.request.urlopen(url)
text = response.read()
data = json.loads(text)

print(data)

and the same with requests - it also doesn't need encoding

import requests

payload = {
    'q': 'white whale:keyes',
    'key': 'AIzaSyDtjvhKOniHFwkIcz7-720bgtnubagFxS8',
}

url = 'https://www.googleapis.com/books/v1/volumes'

r = requests.get(url, params=payload)
data = r.json()

print(data)

Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source
Solution 1