Заголовок декодирования, возвращенный API Википедии для библиотеки запросов Python - PullRequest
0 голосов
/ 23 декабря 2018

Приведенный ниже код запрашивает у API Википедии страницы в категории «Физика» и преобразует ответ в словарь Python.

import ast
import requests
url = "https://en.wikipedia.org/w/api.php?action=query&list=categorymembers&cmtitle=Category:Physics&cmlimit=500&cmcontinue="
response = requests.get(url)
text = response.text
dict = ast.literal_eval(sourceCode)

Вот один из результатов, возвращаемых API Википедии:

        {
            "pageid": 50724262,
            "ns": 0,
            "title": "Blasius\u2013Chaplygin formula"
        },

Странице Википедии, которой соответствует "Blasius\u2013Chaplygin formula", является https://en.wikipedia.org/wiki/Blasius–Chaplygin_formula.

Я хочу использовать «заголовок» для загрузки страниц из Википедии.Я заменил все пробелы подчеркиванием.Но это терпит неудачу.Я делаю:

import requests
url = "https://en.wikipedia.org/wiki/Blasius\u2013Chaplygin_formula"
response = requests.get(url)

Это дает мне:

requests.exceptions.HTTPError: 404 Client Error:
Not Found for url: https://en.wikipedia.org/wiki/Blasius%5Cu2013Chaplygin_formula

Как мне поменять заголовок Blasius\u2013Chaplygin formula на URL, который может быть успешно вызван requests?

Когда я попытался вставить ссылку на Википедию в этот вопрос о переполнении стека, переполнение стека автоматически преобразовало ее в https://en.wikipedia.org/wiki/Blasius%E2%80%93Chaplygin_formula.

Когда я сделал:

import requests
url = "https://en.wikipedia.org/wiki/Blasius%E2%80%93Chaplygin_formula"
response = requests.get(url)

это былоуспешно, поэтому я хочу библиотеку, которая будет выполнять преобразование, подобное этому, которое я могу использовать в Python.

Ответы [ 2 ]

0 голосов
/ 27 января 2019

Чтобы сделать вашу жизнь проще, вы всегда можете использовать некоторые существующие оболочки для API Википедии, такие как Wikipedia-API .

import wikipediaapi
api = wikipediaapi.Wikipedia('en')

# it will shield you from URL encoding problems
p = api.page('Blasius\u2013Chaplygin formula')
print(p.summary)

# and it can make your code shorter
physics = api.page('Category:Physics')
for p in physics.categorymembers.values():
  print(f'[{p.title}]\t{p.summary}')
0 голосов
/ 23 декабря 2018

То, что "\u2013" - это символ Unicode.Он автоматически превращается в en-dash с помощью python, но вы не можете помещать en-dash в ссылки на википедию, поэтому вам нужно url-кодировать его, что и сделал для вас stackoverflow.

Вы можетесделать это самостоятельно, используя что-то вроде этого:

import requests
import urllib.parse

url = "Blasius\u2013Chaplygin_formula"
response = requests.get("https://en.wikipedia.org/wiki/" + urllib.parse.quote(url))

Как urlencode строки запроса в Python?

...