python wikipedia抓取 - 获取其他语言的同一页面的链接?

时间:2014-08-04 15:37:58

标签: python web-scraping wikipedia

如何使用wikipediawikitools软件包从维基百科页面获取其他语言的所有链接?

例如:

我有http://en.wikipedia.org/wiki/Stack_overflow页面,我试图以其他可能的语言获取指向同一页面的链接,例如: http://ko.wikipedia.org/wiki/%EC%8A%A4%ED%83%9D_%EC%98%A4%EB%B2%84%ED%94%8C%EB%A1%9C(韩语)

http://zh.wikipedia.org/wiki/%E5%A0%86%E7%96%8A%E6%BA%A2%E4%BD%8D(中文)。

我想获得所有可能的页面。

我的问题类似于这个人的问题:How to get wikipedia page in multi languages?,我只是想弄清楚是否有可能做同样的工作使用上述包装(它们很容易通过点子)而不是重新发明轮子。

我也很想听听是否不可能,或者是否有其他套餐可以轻松完成这项工作。谢谢!

1 个答案:

答案 0 :(得分:2)

我还没有在wikipediawikitools个软件包中找到这个确切的功能。 wikipedia虽然允许使用set_lang()方法在语言之间切换。

我没有看到通过BeautifulSoup获取语言列表有什么不好,然后使用wikipedia获取不同语言的页面内容:

# -*- coding: utf-8 -*-

import urllib2
from bs4 import BeautifulSoup
import wikipedia

# get languages
soup = BeautifulSoup(urllib2.urlopen('http://en.wikipedia.org/wiki/Stack_Overflow'))
links = [(el.get('lang'), el.get('title')) for el in soup.select('li.interlanguage-link > a')]

for language, title in links:
    page_title = title.split(u' – ')[0]
    wikipedia.set_lang(language)
    page = wikipedia.page(page_title)
    print language
    print page.summary
    print "-----"

打印:

de
Pufferüberläufe (englisch buffer overflow) gehören zu den häufigsten Sicherheitslücken in aktueller Software, die sich u. a. über das Internet ausnutzen lassen können. Im Wesentlichen werden bei einem Pufferüberlauf durch Fehler im Programm zu große Datenmengen in einen dafür zu kleinen reservierten Speicherbereich, den Puffer, geschrieben, wodurch nach dem Ziel-Speicherbereich liegende Speicherstellen überschrieben werden.
Dreht es sich nicht um einen ganzen Datenblock, sondern um eine Zieladresse eines einzelnen Datensatzes, spricht man auch von pointer overflow, nach dem Pointer (Zeiger), der anzeigt, wo der Datensatz im Puffer hingeschrieben werden soll.

-----
es
En informática, un desbordamiento de pila (stack overflow/overrun) es un problema aritmético que hace referencia al exceso de flujo de datos almacenados en la pila de una función, esto permite que la dirección de retorno de la pila pueda ser modificada por otra parte de un atacante para obtener un beneficio propio, que generalmente es malicioso.

...

您也可以完全切换到BeautifulSoup,但这很容易导致重新发明轮子:

import urllib2
from bs4 import BeautifulSoup

# get languages and links
soup = BeautifulSoup(urllib2.urlopen('http://en.wikipedia.org/wiki/Stack_Overflow'))
links = [(el.get('lang'), el.get('href')) for el in soup.select('li.interlanguage-link > a')]

for language, link in links:
    soup = BeautifulSoup(urllib2.urlopen('http:' + link))
    print language, soup.title.text

打印:

de Stack Overflow (Website) – Wikipedia
es Stack Overflow - Wikipedia, la enciclopedia libre
fa استک اورفلو - ویکی‌پدیا، دانشنامهٔ آزاد
fr Stack Overflow — Wikipédia
ko 스택 오버플로 (웹사이트) - 위키백과, 우리 모두의 백과사전
it Stack Overflow - Wikipedia
hu Stack Overflow - Wikipédia
ja Stack Overflow - Wikipedia
pl StackOverflow – Wikipedia, wolna encyklopedia
ro Stack Overflow - Wikipedia
ru Stack Overflow — Википедия
ta இசுட்டாக் ஓவர்ஃபுலோ - தமிழ் விக்கிப்பீடியா
uk Stack Overflow — Вікіпедія
zh Stack Overflow - 维基百科,自由的百科全书