Как я могу получить текст статьи из Википедии, используя Python 3 с Beautiful Soup? - PullRequest
0 голосов
/ 16 декабря 2018

У меня есть этот скрипт на 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

Как вы можете видеть, я могу получить заголовок из статьи, но не могу понять, как получить текст из "Математики (от греческого языка)μά ... "к таблице содержания ...

Ответы [ 6 ]

0 голосов
/ 17 декабря 2018

Чтобы получить правильный способ использования функции, вы можете просто получить 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

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

0 голосов
/ 17 декабря 2018

То, что вам нужно - это содержимое страницы (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 для использования MediaWiki API , которые могутавтоматизируйте некоторые мелкие детали его использования, хотя поддерживаемый ими набор функций может отличаться.Тем не менее, использование API напрямую из кода без промежуточной библиотеки также вполне возможно.

0 голосов
/ 16 декабря 2018

Вы можете получить желаемый результат, используя библиотеку 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)
0 голосов
/ 16 декабря 2018

Существует намного более простой способ получения информации из Википедии - API Википедии .

Существует эта оболочка Python , которая позволяет вам делатьв несколько строк только с нулевым HTML-разбором:

import wikipediaapi

wiki_wiki = wikipediaapi.Wikipedia('en')

page = wiki_wiki.page('Mathematics')
print(page.summary)

Отпечатки:

Математика (от греческого языка μάθημα máthēma, «знание, изучение, обучение») включает в себя изучениетаких тем, как количество, структура, пространство и изменение ... (намеренно опущено)

И, вообще, старайтесь избегать скрипа экрана, если есть прямой доступный API.

0 голосов
/ 16 декабря 2018

Используйте библиотеку wikipedia

import wikipedia
#print(wikipedia.summary("Mathematics"))
#wikipedia.search("Mathematics")
print(wikipedia.page("Mathematics").content)
0 голосов
/ 16 декабря 2018

выберите тег <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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...