2017-02-13 19 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() 
相关问题