2016-07-04 1 views
0

Python 및 BeautifulSoup 초보자는 여기에 있습니다.수 백 페이지 깊이의 스크랩 스레드/BeautifulSoup

각 페이지 당 50 개의 개별 스레드가 포함 된 약 500 페이지의 포럼을 다듬려고합니다. 이 스레드 중 일부는 약 200 페이지 분의 게시물을 포함합니다. 나는 아무 문제 추출이 없지만

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

:

내가 자동화 된 방식으로 전체 포럼의 관련 부분을 긁어 수있는 프로그램을 작성하고 싶습니다 엔트리 포인트로 하나의 URL을 공급 된 개별 스레드와 스레드를 포함하는 페이지 모두에 대해 '다음 링크'... :

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

'for itertools.chain.from_iterable (page_list) :'에 대한 페이지입니다. –

+0

답장 시간을내어 주셔서 감사합니다, Padraic. 유감스럽게도 다음과 같은 오류가 발생합니다. ValueError : 알 수없는 URL 유형 : 'h'. 이 일을하는 또 다른 방법이 있습니까? – Gabriel

답변

0

나는이 문제를 해결 했으므로 다른 사람이 도움이 될 수 있도록 답변을 게시하고 있습니다.

그래서 문제는 urlopen이 목록의 목록에서 발견 된 URL을 열 수 없다는 것입니다.

필자의 경우 각 포럼 페이지에는 최대 1 개의 관련 내부 링크가있었습니다. 오히려 여기에서 볼 수 있듯이, 내부 링크를 포함하는 목록을 반환하는 내 getNext_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을 반환을 요청 ... (빈리스트 next_link 참조)

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는 단순히 문자열이므로 반복되는 목록에 쉽게 추가 할 수 있습니다 (위의 내 게시물 참조). Voilà!