Как я могу получить текст статьи из Википедии, используя 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")

enter image description here

Затем вы можете разобрать его с любой библиотекой, которую вы хотите извлечь, что вам нужно :)