从Wikipedia文章(Python)中提取第一段

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

例如,对于爱因斯坦而言 ,那将是:

阿尔伯特·爱因斯坦(发音为/ælbərtaɪnstaɪn/;德语:[albɐtaɪnʃtaɪn](听); 1879年3月14日 – 1955年4月18日)是理论物理学家,哲学家和作家,被广泛认为是最具影响力和标志性的科学家和知识分子之一所有的时间。 一位德国 – 瑞士诺贝尔奖得主爱因斯坦经常被认为是现代物理学之父。 他获得了1921年的诺贝尔物理学奖,“因为他为理论物理学服务,尤其是他发现了光电效应的规律”[3]。

前一段时间,我做了两个纯文本维基百科文章。 我知道他们并不是最好的解决scheme,但是你可以根据自己的需求进行调整:

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 

我写了一个Python库,旨在使这非常简单。 在Github检查一下。

要安装它,运行

 $ pip install wikipedia 

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

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

版画

阿尔伯特·爱因斯坦(Albert Einstein,1879年3月14日 – 1955年4月18日)是德国出生的理论物理学家,发展了现代物理学的两大支柱之一的广义相对论与量子力学一起)。 虽然他的质能等价公式E = mc2(被称为“世界上最着名的等式”)最为人所知,但他因为理论物理学的服务而获得了1921年的“诺贝尔物理学奖”,尤其是他发现了光电效应规律“。

至于它是如何工作的, wikipedia向MediaWiki API的移动前端扩展 ( Mobile Frontend Extension)发出一个请求,该扩展返回维基百科文章的移动友好版本。 具体而言,通过传递参数prop=extracts&exsectionformat=plain ,MediaWiki服务器将parsingWikitext,并返回所请求文章的纯文本摘要,直至并包括整个页面文本。 它也接受参数excharsexsentences ,这并不奇怪,限制了由API返回的字符和句子的数量。

我做的是这样的:

 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 

维基百科运行一个MediaWiki扩展,它提供了这个function作为一个API模块。 TextExtracts实现了action=query&prop=extracts选项,返回前N个句子和/或简单的介绍,如HTML或纯文本。

以下是您要调用的API调用: https : //en.wikipedia.org/w/api.php?action = query&prop = extracts&title = Albert%20Einstein&exintro =&exsentences = 2&explaintext =&redirect =&formatformat = 2

  • action=query&prop=extracts请求这个信息
  • (ex)句子= 2,(ex)intro =,(ex)明文,是模块的参数(查看其API文档的第一个链接),从简介中请求两个句子作为纯文本; HTML留下后者。
  • redirects= (true)所以如果你要求“标题=爱因斯坦”,你会得到阿尔伯特·爱因斯坦的页面信息
  • formatversion=2 ,UTF-8格式更清晰。

有各种各样的库,包装调用MediaWiki行动API,如在DGund的答案,但它不是很难使自己的API调用。

search结果中的页面信息讨论获取此文本摘录,以及获取文章的描述和主导图像。

首先,我保证我没有被吓倒。

以下是可能有用的问题: 使用Python获取维基百科文章

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

有没有维基百科API?

如果你想图书馆的build议, BeautifulSoup , urllib2浮现在脑海。 之前在SO上回答: 用Python进行Web抓取 。

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

正如其他人所说,一种方法是使用维基媒体API和urllib或urllib2。 下面的代码片段是我用来提取所谓的“主angular”部分,其中有文章摘要和信息框的一部分。 这将检查返回的文本是否是一个redirect而不是实际的内容,也可以让你跳过信息框(如果存在的话)(在我的情况下,我用不同的代码来提取和格式化信息框。

 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标记,所以你需要做一些清理。 如果你只是想要第一段,而不是整个第一段,寻找第一个新的行字符。

尝试使用urllib获取站点,使用BeautifulSouplxml来parsing数据。

尝试pattern

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