2017-02-13 17 views
-1

是否有可能抽取數據的形式存在維基百科文章內的子鏈接如何從維基百科文章中的子鏈接刮取數據?

import bs4 as bs 
import urllib.request 
import re 
sauce = urllib.request.urlopen('https://en.wikipedia.org/wiki/Greenhouse_gas').read() 
soup=bs.BeautifulSoup(sauce,'lxml') 
links = soup.find("div",{"id" : "bodyContent"}).findAll("a" , href=re.compile("(/wiki/)+([A-Za-z0-9_:()])+")) 

for link in links: 
    print(link['href']) 
    webpage=urllib.request.urlopen(link['href']) 
    soup=bs.BeautifulSoup(webpage,'lxml') 
+1

問題是什麼,在這裏?是的,它「可以從維基百科文章中提取數據形式的子鏈接」;什麼是錯誤的/運行上面的代碼時會得到什麼回溯? – blacksite

回答

0

links列表包含結束你正在尋找刮網址。運行你的代碼,我收到了一個ValueError: unknown url type: '/wiki/Wikipedia:Pending_changes'。因此,要解決什麼,我想我

s your issue, try this: 

beg_link = 'http://www.wikipedia.com' 

for link in links: 
    full_link = beg_link + link['href'] 
    print(full_link) 
    webpage=urllib.request.urlopen(full_link) 
    soup=bs.BeautifulSoup(webpage,'lxml') 

它打印和結果:

http://www.wikipedia.com/wiki/Wikipedia:Pending_changes 
http://www.wikipedia.com/wiki/GHG_(disambiguation) 
http://www.wikipedia.com/wiki/File:Greenhouse_Effect.svg 
... 
+0

但是,當我嘗試使用上面的代碼訪問這些頁面時,它顯示錯誤 –

0

是的,這是可能的跟蹤鏈接和檢索更多的聯繫。爲此,您可以使用遞歸函數(一個調用自身的函數)。你也應該設置你取回或你的程序將不會停止鏈接數的限制,你應該檢查你沒有訪問過已經鏈接:

import bs4 as bs 
import urllib2 
import re 


def get_links(links, url, limit=100): 
    sauce = urllib2.urlopen('https://en.wikipedia.org/wiki' + url).read() 
    soup = bs.BeautifulSoup(sauce,'lxml') 
    pos = len(links) 
    for link in soup.find("div",{"id" : "bodyContent"}).findAll("a" , href=re.compile("(/wiki/)+([A-Za-z0-9_:()])+")): 
     if len(links) < limit and link['href'] not in links: 
      links.append(link['href']) 
    if len(links) < limit: 
     for url in links[pos:]: 
      get_links(links, url, limit) 


def main(): 
    links = [] 
    get_links(links, '/Greenhouse_gas') 
    print links 

if __name__ == '__main__': 
    main() 
相關問題