Как я могу получить текст статьи из Википедии, используя Python 3 с Beautiful Soup?
У меня есть этот сценарий на Python 3:
response = simple_get("https://en.wikipedia.org/wiki/Mathematics")
result = {}
result["url"] = url
if response is not None:
html = BeautifulSoup(response, 'html.parser')
title = html.select("#firstHeading")[0].text
Как видите, я могу получить заголовок из статьи, но не могу понять, как получить текст из "Математики (от греческого языка...") к таблице содержания...
Ответы
Ответ 1
выберите <p>
. Есть 52 элемента. Не уверен, если вы хотите все это, но вы можете перебирать эти теги, чтобы сохранить его, как вы можете. Я просто решил напечатать каждый из них, чтобы показать результат.
import bs4
import requests
response = requests.get("https://en.wikipedia.org/wiki/Mathematics")
if response is not None:
html = bs4.BeautifulSoup(response.text, 'html.parser')
title = html.select("#firstHeading")[0].text
paragraphs = html.select("p")
for para in paragraphs:
print (para.text)
# just grab the text up to contents as stated in question
intro = '\n'.join([ para.text for para in paragraphs[0:5]])
print (intro)
Ответ 2
Существует намного более простой способ получения информации из Википедии - API Википедии.
Есть эта обертка Python, которая позволяет сделать это в несколько строк только с нулевым разбором HTML:
import wikipediaapi
wiki_wiki = wikipediaapi.Wikipedia('en')
page = wiki_wiki.page('Mathematics')
print(page.summary)
Печать:
Математика (от греческого μάθημα máthēma, "знание, изучение, обучение") включает изучение таких тем, как количество, структура, пространство и изменение... (намеренно опущено)
И, вообще, старайтесь избегать скрипа экрана, если есть прямой API.
Ответ 3
Используйте библиотеку wikipedia
import wikipedia
#print(wikipedia.summary("Mathematics"))
#wikipedia.search("Mathematics")
print(wikipedia.page("Mathematics").content)
Ответ 4
Вы можете получить желаемый результат, используя библиотеку lxml
как lxml
ниже.
import requests
from lxml.html import fromstring
url = "https://en.wikipedia.org/wiki/Mathematics"
res = requests.get(url)
source = fromstring(res.content)
paragraph = '\n'.join([item.text_content() for item in source.xpath('//p[following::h2[2][span="History"]]')])
print(paragraph)
Использование BeautifulSoup
:
from bs4 import BeautifulSoup
import requests
res = requests.get("https://en.wikipedia.org/wiki/Mathematics")
soup = BeautifulSoup(res.text, 'html.parser')
for item in soup.find_all("p"):
if item.text.startswith("The history"):break
print(item.text)
Ответ 5
То, что вам нужно, - это содержимое страницы (HTML) без окружающих элементов навигации. Как я описал в этом предыдущем ответе от 2013 года, есть (по крайней мере) два способа получить его:
Преимущество использования API заключается в том, что он также может дать вам много другой информации о странице, которая может оказаться полезной. Например, если вы хотите иметь список межъязыковых ссылок, обычно отображаемых на боковой панели страницы, или категорий, обычно отображаемых под областью содержимого, вы можете получить их из API следующим образом:
https://en.wikipedia.org/w/api.php?format=xml&action=parse&page=Mathematics&prop=langlinks|categories
(Чтобы получить содержимое страницы по тому же запросу, используйте prop=langlinks|categories|text
.)
Существует несколько библиотек Python для использования API MediaWiki, которые могут автоматизировать некоторые мелкие детали его использования, хотя поддерживаемый ими набор функций может варьироваться. Тем не менее, использование API напрямую из кода без промежуточной библиотеки также вполне возможно.
Ответ 6
Чтобы получить правильный способ использования функции, вы можете просто получить JSON API, предлагаемый Wikipedia:
from urllib.request import urlopen
from urllib.parse import urlencode
from json import loads
def getJSON(page):
params = urlencode({
'format': 'json',
'action': 'parse',
'prop': 'text',
'redirects' : 'true',
'page': page})
API = "https://en.wikipedia.org/w/api.php"
response = urlopen(API + "?" + params)
return response.read().decode('utf-8')
def getRawPage(page):
parsed = loads(getJSON(page))
try:
title = parsed['parse']['title']
content = parsed['parse']['text']['*']
return title, content
except KeyError:
# The page doesn't exist
return None, None
title, content = getRawPage("Mathematics")
Затем вы можете разобрать его с любой библиотекой, которую вы хотите извлечь, что вам нужно :)