Also this notebook is associated with IPython kernel, and may therefore contain Python code. In this notebook we fetch and display the latest XKCD strip using both regular Python and special IPython features.
As a prerequisite, we have been given the XKCD HTTP API URL https://xkcd.com/info.0.json
for fetching information of the latest strip in JSON.
Let's save that URL into a variable.
url = 'https://xkcd.com/info.0.json'
Then we continue with importing Requests library for easily fetching information from the Internet.
import requests
Now we are ready to fetch the data at the URL into a variable.
response = requests.get(url)
And we can print the response and its content into standard output to see what we have.
print(f'Response:\n{response}')
print()
print(f'Content:\n{response.content}')
Response: <Response [200]> Content: b'{"month": "1", "num": 2094, "link": "", "year": "2019", "news": "", "safe_title": "Short Selling", "transcript": "", "alt": "\\"I\'m selling all my analogies at auction tomorrow, and that witch over there will give you 20 beans if you promise on pain of death to win them for her.\\" \\"What if SEVERAL people promised witches they\'d win, creating some kind of a ... squeeze? Gosh, you could make a lot of\\u00e2\\u0080\\u0093\\" \\"Don\'t be silly! That probably never happens.\\"", "img": "https://imgs.xkcd.com/comics/short_selling.png", "title": "Short Selling", "day": "4"}'
That is somewhat readable, but we should do better.
One of the many great Jupyter features provided by the underlying IPython foundation, is support for rich output. In this case, we can use IPython display JSON helper class to let JupyterLab know that it should display JSON.
from IPython.display import JSON
json = response.json()
JSON(json)
<IPython.core.display.JSON object>
In the same way, we can also display the actual strip from the URL provided in JSON.
Let's simply fetch the raw data from the image URL, which we got from the JSON data, and render it using IPython display Image helper class.
from IPython.display import Image
url = json['img']
response = requests.get(url)
Image(response.content)
But, to be honest, this is so usual use-case that it is enough to pass just the URL of the image to the Image helper class and it does also the fetch for us.
Image(url)
The XKCD strip from https://xkcd.com/ is licensed under a Creative Commons Attribution-NonCommercial 2.5 License.