从维基百科文章(Python)中提取第一段

时间:2010-12-16 12:49:23

标签: python wikipedia

如何使用Python从维基百科文章中提取第一段?

例如,对于 Albert Einstein ,那将是:

  阿尔伯特爱因斯坦(发音为/ælbərt   aɪnstaɪn/;德语:[albɐtaɪnʃtaɪn]   (听); 1879年3月14日至4月18日   1955年)是理论物理学家,   广泛的哲学家和作家   被认为是最多的   有影响力和标志性的科学家和   有史以来的知识分子。一个   德国 - 瑞士诺贝尔奖获得者,爱因斯坦   通常被视为父亲   现代物理学。[2]他收到了   1921年诺贝尔物理学奖“为他的   为理论物理服务,和   尤其是他的发现   光电效应定律“。[3]

10 个答案:

答案 0 :(得分:39)

我写了一个Python库,旨在让这个变得非常容易。请查看Github

要安装它,请运行

$ pip install wikipedia

然后要获取文章的第一段,只需使用wikipedia.summary函数即可。

>>> import wikipedia
>>> print wikipedia.summary("Albert Einstein", sentences=2)

打印

  阿尔伯特爱因斯坦(/ælbərtaɪnstaɪn/;德语:[albɐtaɪnʃtaɪn](       听); 1879年3月14日 - 1955年4月18日)是德国出生的       发展广义相对论的理论物理学家,       现代物理学的两大支柱之一(与量子学一起)       力学)。虽然以其质能等效公式E而闻名       = mc2(被称为“世界上最着名的方程式”),他获得了1921年诺贝尔物理学奖“       理论物理学,尤其是他对法律的发现       光电效应“。

就其工作原理而言,wikipedia向MediaWiki API的Mobile Frontend Extension发出请求,该API返回移动友好版本的维基百科文章。具体而言,通过传递参数prop=extracts&exsectionformat=plain,MediaWiki服务器将解析Wikitext并返回您正在请求的文章的纯文本摘要,包括整个页面文本。它还接受参数excharsexsentences,这毫不奇怪地限制了API返回的字符数和句子数。

答案 1 :(得分:38)

前段时间我用纯文本获得维基百科文章。我知道它们不是最好的解决方案,但您可以根据自己的需求进行调整:

wikipedia.py
wiki2plain.py

你可以像这样使用它:

from wikipedia import Wikipedia
from wiki2plain import Wiki2Plain

lang = 'simple'
wiki = Wikipedia(lang)

try:
    raw = wiki.article('Uruguay')
except:
    raw = None

if raw:
    wiki2plain = Wiki2Plain(raw)
    content = wiki2plain.text

答案 2 :(得分:10)

我做的是:

import urllib
import urllib2
from BeautifulSoup import BeautifulSoup

article= "Albert Einstein"
article = urllib.quote(article)

opener = urllib2.build_opener()
opener.addheaders = [('User-agent', 'Mozilla/5.0')] #wikipedia needs this

resource = opener.open("http://en.wikipedia.org/wiki/" + article)
data = resource.read()
resource.close()
soup = BeautifulSoup(data)
print soup.find('div',id="bodyContent").p

答案 3 :(得分:8)

Wikipedia运行MediaWiki扩展,它将此功能作为API模块提供。 TextExtracts通过选项返回第一个 N 句子和/或仅作为HTML或纯文本的引言来实现action=query&prop=extracts

这是您要制作的API调用,请尝试: https://en.wikipedia.org/w/api.php?action=query&prop=extracts&titles=Albert%20Einstein&exintro=&exsentences=2&explaintext=&redirects=&formatversion=2

  • action=query&prop=extracts要求此信息
  • (ex)sentences = 2,(ex)intro =,(ex)plaintext,是模块的参数(参见其API文档的第一个链接),要求从简介中的两个句子作为纯文本;为HTML留下后者。
  • redirects=(true)所以如果你要求" titles = Einstein"您将获得Albert Einstein页面信息
  • formatversion=2表示UTF-8中更清晰的格式。

有各种各样的库来包装调用MediaWiki动作API,例如DGund的答案中的那个,但是自己进行API调用并不太难。

Page info in search results讨论了获取此文本摘录,以及获取文章的描述和引导图像。

答案 4 :(得分:2)

如果您需要图书馆建议,请考虑BeautifulSoupurllib2。 在之前回答:Web scraping with Python

我已经尝试过urllib2来获取维基百科的页面。但是,这是403(禁止)。 MediaWiki为Wikipedia提供API,支持各种输出格式。我没有使用python-wikitools,但可能值得一试。 http://code.google.com/p/python-wikitools/

答案 5 :(得分:2)

首先,我保证我不会嗤之以鼻。

以下是可能有用的上一个问题: Fetch a Wikipedia article with Python

在这个人建议使用维基百科高级API,这导致了这个问题:

Is there a Wikipedia API?

答案 6 :(得分:1)

正如其他人所说,一种方法是使用维基媒体API和urllib或urllib2。下面的代码片段是我用来提取所谓的“引导”部分的一部分,其中包含文章摘要和信息框。这将检查返回的文本是否是重定向而不是实际内容,并且还允许您跳过信息框(如果存在)(在我的情况下,我使用不同的代码来拉出并格式化信息框。

contentBaseURL='http://en.wikipedia.org/w/index.php?title='

def getContent(title):
    URL=contentBaseURL+title+'&action=raw&section=0'
    f=urllib.urlopen(URL)
    rawContent=f.read()
    return rawContent

infoboxPresent = 0
# Check if a redirect was returned.  If so, go to the redirection target
    if rawContent.find('#REDIRECT') == 0:
        rawContent = getFullContent(title)
        # extract the redirection title
        # Extract and format the Infobox
        redirectStart=rawContent.find('#REDIRECT[[')+11   
        count = 0
        redirectEnd = 0
        for i, char in enumerate(rawContent[redirectStart:-1]):
            if char == "[": count += 1
            if char == "]}":
                count -= 1
                if count == 0:
                    redirectEnd = i+redirectStart+1
                    break
        redirectTitle = rawContent[redirectStart:redirectEnd]
        print 'redirectTitle is: ',redirectTitle
        rawContent = getContent(redirectTitle)

    # Skip the Infobox
    infoboxStart=rawContent.find("{{Infobox")   #Actually starts at the double {'s before "Infobox"
    count = 0
    infoboxEnd = 0
    for i, char in enumerate(rawContent[infoboxStart:-1]):
        if char == "{": count += 1
        if char == "}":
            count -= 1
            if count == 0:
                infoboxEnd = i+infoboxStart+1
                break

    if infoboxEnd <> 0:
        rawContent = rawContent[infoboxEnd:]

您将收回原始文本,包括wiki标记,因此您需要进行一些清理。如果您只想要第一段而不是整个第一段,请查找第一个新行字符。

答案 7 :(得分:0)

尝试组合使用urllib来获取网站,然后BeautifulSouplxml来解析数据。

答案 8 :(得分:0)

尝试pattern

pip install pattern

from pattern.web import Wikipedia
article = Wikipedia(language="af").search('Kaapstad', throttle=10)
print article.string

答案 9 :(得分:0)

相对较新的REST API有一个summary方法,非常适合这种用法,并在这里做了很多其他答案中提到的事情(例如删除wikicode)。它甚至包括图像和地理坐标(如果适用)。

使用可爱的requests模块和Python 3:

import requests
r = requests.get("https://en.wikipedia.org/api/rest_v1/page/summary/Amsterdam")
page = r.json()
print(page["extract"]) # Returns 'Amsterdam is the capital and...'