2016-07-04 40 views
0

Python和BeautifulSoup新手在這裏。數百頁深的刮線w BeautifulSoup

我想刮一個論壇,有約500頁,其中每個包含50個單獨的線程。其中一些線程包含大約200頁的帖子。

我想編寫一個程序,可以刮掉以自動方式全論壇的相關部分,已被送入一個單一的URL作爲切入點:

page_list = ['http://forum.doctissimo.fr/sante/diabete/liste_sujet-1.htm'] 

雖然我沒有問題解壓在「下一個環節」兩個單獨的線程和包含線程的網頁...:

def getNext_link(soup0bj): 
     #extracts a page's next link from the Bsoup object 

     try: 
      next_link = [] 
      soup0bj = (soup0bj) 
      for link in soup0bj.find_all('link', {'rel' : 'next'}): 
      if link.attrs['href'] not in next_link: 
       next_link.append(link.attrs['href']) 

     return next_link 

...我只能和一個程序,它是種子URL,只從第一頁的內容提取它承載的每個線程的數量。然後程序結束:

 for page in page_list: 
     if page != None: 
      html = getHTMLsoup(page) 
      print(getNext_link(html)) 
      page_list.append(getNext_link(html)) 
      print(page_list) 

      for thread in getThreadURLs(html): 
      if thread != None: 
       html = getHTMLsoup(thread) 
       print('\n'.join(getHandles(html))) 
       print('\n'.join(getTime_stamps(html))) 
       print('\n', getNext_link(html)) 
       print('\n'.join(getPost_contents(html)),'\n') 

我試圖追加了「未來鏈接」到page_list,但沒有奏效,因爲的urlopen然後嘗試訪問列表,而不是一個字符串。我也試過這樣:

for page in itertools.chain(page_list): 

...但節目引發此錯誤:

AttributeError: 'list' object has no attribute 'timeout' 

我很堅持。任何和所有的幫助將是最受歡迎的!

+0

'用於itertools.chain.from_iterable(page_list)中的頁面:'。 –

+0

感謝您花時間回覆Padraic。不幸的是,你的建議會導致以下錯誤:ValueError:未知的url類型:'h'。有沒有另外一種方法可以讓我看看? – Gabriel

回答

0

我自己解決了這個問題,所以我發佈了答案,以防其他人受益。

所以,問題是,urlopen無法打開列表中的列表中找到的URL。

在我的情況下,每個論壇頁面最多有1個相關的內部鏈接。不要問我getNext_link函數返回一個包含內部鏈接的列表,在這裏看到(見空列表next_link)...

def getNext_link(soup0bj): 
     #extracts a page's next link (if available) 

     try: 
      soup0bj = (soup0bj) 
      next_link = [] 

      if len(soup0bj.find_all('link', {'rel' : 'next'})) != 0: 
       for link in soup0bj.find_all('link', {'rel' : 'next'}): 
       next_link.append(link.attrs['href']) 

     return next_link 

我問它返回的URL作爲一個字符串,如下所示:

def getNext_link(soup0bj): 

     try: 
      soup0bj = (soup0bj) 

      if len(soup0bj.find_all('link', {'rel' : 'next'})) != 0: 
       for link in soup0bj.find_all('link', {'rel' : 'next'}): 
       next_link = link.attrs['href'] 
       return next_link 

由於變量next_link只是一個字符串,它可以很容易地添加到正在迭代的列表中(請參閱我的帖子以獲取詳細信息)。瞧!