如何使用Python 3和Beautiful Soup获取Wikipedia文章的文本?

时间:2018-12-16 17:17:19

标签: python web-scraping beautifulsoup wikipedia

我有这个用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

如您所见,我可以从文章中获得标题,但是我不知道如何从“数学(从希腊语μά...”到内容表)中获取文本。

7 个答案:

答案 0 :(得分:31)

从Wikipedia中获取信息的方法要简单得多- Wikipedia API

this Python wrapper,它使您仅用零HTML解析就可以在几行中完成它:

import wikipediaapi

wiki_wiki = wikipediaapi.Wikipedia('en')

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

打印:

  

数学(来自希腊语μάθημαmáthēma,“知识,学习,学习”)   包括对诸如数量,结构,空间和   更改...(故意省略)

而且,通常,如果有直接的API,请尽量避免刮屏。

答案 1 :(得分:14)

选择<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 :(得分:14)

使用库wikipedia

import wikipedia
#print(wikipedia.summary("Mathematics"))
#wikipedia.search("Mathematics")
print(wikipedia.page("Mathematics").content)

答案 3 :(得分:5)

您可以使用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)

答案 4 :(得分:2)

您似乎想要的(HTML)页面内容没有周围的导航元素。正如我在this earlier answer from 2013中所述,有(至少)两种方法可以获取它:

使用API​​的优势在于,它还可以为您提供a lot of other information有关可能有用的页面的信息。例如,如果您想在页面的侧边栏中显示通常显示的中间语言链接的列表,或者在内容区域的下面正常显示的类别,则可以从API中获得以下链接:

https://en.wikipedia.org/w/api.php?format=xml&action=parse&page=Mathematics&prop=langlinks|categories

(要获得具有相同请求的页面内容,请使用prop=langlinks|categories|text。)

有几个Python libraries for using the MediaWiki API可以使使用它的一些细节变得自动化,尽管它们支持的功能集可能有所不同。就是说,完全可以直接从代码中直接使用API​​,而无需在两者之间使用库。

答案 5 :(得分:2)

要正确使用函数,您只需获取Wikipedia提供的 JSON API

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

然后可以将其与任何要提取所需内容的库一起解析:)

答案 6 :(得分:-1)

我使用这个:通过“idx”我可以确定我想阅读哪个段落。

from from bs4 import BeautifulSoup
import requests

res = requests.get("https://de.wikipedia.org/wiki/Pferde")
soup = BeautifulSoup(res.text, 'html.parser')
for idx, item in enumerate(soup.find_all("p")):
    if idx == 1:
        break
print(item.text)