刮伤数百页深的W / BeautifulSoup线程

时间:2016-07-04 22:03:51

标签: python web-scraping beautifulsoup

Python和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'

我真的被困住了。任何和所有的帮助都是最受欢迎的!

1 个答案:

答案 0 :(得分: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只是一个字符串,因此可以很容易地将其添加到正在迭代的列表中(有关详细信息,请参阅上面的帖子)。瞧!