2010-12-16 89 views
29

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

例如,对于爱因斯坦,这将是:

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

+2

“urllib”用于获取页面,“BeautifulSoup”用于解析HTML。尽管还有其他的方法,但是在StackOverflow本身上搜索它们。这已经被讨论了很多次。 – user225312 2010-12-16 12:54:24

+0

你想要什么标记? mediawiki,html? – khachik 2010-12-16 12:55:49

+0

HTML。 (15个字符的限制) – 2010-12-16 12:59:04

回答

37

前段时间我以纯文本形式获取维基百科文章的两个类。我知道他们是不是最好的解决办法,但你可以使其适应你的需求:

        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 
+1

在http://pastebin.com/FVDxLWNG #REDIRECT不适用于it.wikipedia.org,它必须翻译成意大利语,如#RINVIA。我怀疑#REDIRECT只适用于英语。 – 2012-04-01 09:45:37

+0

+1为“unwiki”功能。非常好。 – HerrKaputt 2012-11-20 16:07:41

0

尝试的urllib组合,以获取网站和BeautifulSouplxml分析数据。

+0

我很高兴能够手动解析html。 hoooo yeahhh – dzen 2011-05-03 12:32:37

2

如果你想图书馆的建议,BeautifulSoup,urllib2想到。 回复于SO之前:Web scraping with Python

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

+0

使用BeautifulSoup – dheerosaur 2010-12-16 13:00:43

+0

可能维基百科阻止一些useragent :) – dzen 2011-05-03 12:33:18

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标记的原始文本,因此您需要进行一些清理。如果您只想要第一段,而不是整个第一段,请查找第一个新行字符。

9

我所做的是:

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 
34

我写了一个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日至4月18日1955)是在德国出生的 理论物理学家谁发展了广义相对论, 现代物理学的两大支柱之一(与量子 力学)。尽管他的质能等价公式E = mc2(被称为“世界上最着名的等式”)最为人所知,但他因为理论物理学的 服务获得了1921年的诺贝尔物理学奖,尤其是他的发现 的光电效应法“。

至于它是如何工作的,wikipedia使得到MediaWiki的API,它返回维基百科文章的移动友好版本的Mobile Frontend Extension的请求。具体而言,通过传递参数prop=extracts&exsectionformat=plain,MediaWiki服务器将解析Wikitext并返回您正在请求的文章的纯文本摘要,直至并包括整个页面文本。它也接受参数excharsexsentences,这并不意外地限制了API返回的字符和句子的数量。

+3

这个图书馆设计得非常好,而且很容易使用!做得好。 :) – Kitchi 2014-07-03 19:47:36

+0

我可以让它在代理之后工作吗? – kuroop 2015-07-01 11:20:11

+0

'prop = extracts'已于2014年从MobileFrontend拆分为单独的[TextExtracts](https://www.mediawiki.org/wiki/Extension:TextExtracts#API)扩展名,但API调用未更改。 – skierpage 2015-11-11 05:26:07

0

尝试pattern

pip install pattern 

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

Wikipedia运行一个MediaWiki扩展,该扩展提供了与API模块完全相同的功能。 TextExtracts执行action=query&prop=extracts选项返回第一个N句子和/或只是介绍,作为HTML或纯文本。

这里的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)的句子= 2,(前)介绍=,(前)明文,是模块的参数(请参阅其API文档的第一个链接)要求将介绍中的两个句子作为纯文本; HTML留下后者。
  • redirects=(真),所以如果你问“的标题=爱因斯坦”,你会得到爱因斯坦页面信息
  • formatversion=2为UTF-8格式的清洁剂。

有各种各样的库,包括调用MediaWiki操作API,例如在DGund的答案中的一个,但它不是很难让你自己调用API。

Page info in search results讨论获取此文本提取,以及获取文章的描述和主角图像。