在网络抓取工具中解析HTML页面

时间:2017-08-17 16:09:57

标签: python python-2.7 web-crawler html-parsing urllib2

我正在尝试构建一个网络抓取工具,抓取页面上的所有链接并将其添加到文件中。

我的Python代码包含执行以下操作的方法: -

  1. 打开指定的网页(使用urllib2模块)

  2. 检查HTTP标头内容类型是否包含 text / html

  3. 将原始HTML响应转换为可读代码并将其存储到 html_string 变量中。

  4. 然后创建 Link_Finder 类的实例,该类采用属性基本URL(Spider_url)和页面url(page_url)。 Link_Finder在另一个模块link_finder.py中定义。
  5. html_string 然后使用Feed函数提供给班级。
  6. 下面将详细介绍Link_Finder类。

    def gather_links(page_url):     #page_url is relative url
            html_string=''
            try :
                req=urllib2.urlopen(page_url)
                head=urllib2.Request(page_url)
                if 'text/html' in head.get_header('Content-Type'):              
                    html_bytes=req.read()
                    html_string=html_bytes.decode("utf-8")
                finder=LinkFinder(Spider.base_url,page_url)
                finder.feed(html_string)            
            except Exception as e:
                print "Exception " + str(e)
                return set()
            return finder.page_links()
    

    link_finder.py模块使用标准Python HTMLParser urlparse 模块。 Link_Finder类继承自 HTMLParser 并覆盖handle_starttag函数以获取具有href属性的所有 a 标记,并将url添加到集合(self.queue)< / p>

    from HTMLParser import HTMLParser 
    import urlparse     
    class LinkFinder(HTMLParser):
        def __init__(self,base_url,page_url):       #page_url is relative url 
            super(LinkFinder,self).__init__()      
            self.base_url=base_url
            self.page_url=page_url
            self.links=set()
        def handle_starttag(self,tag,attrs):    #Override default handler methods
            if tag==a:
                for(key,value) in attrs:
                    if key=='href':
                        url=urlparse.urljoin(self.base_url,value) #Get exact url
                        self.links.add(url)
        def error(self,message):
            pass
        def page_links(self):     #return set of links
            return self.links
    

    我收到了异常

      

    类型的参数&#39; NoneType&#39;是不可迭代的

    我认为我使用urllib2的方式问题请求检查标题内容。 我对此有点新意,所以一些解释会很好

1 个答案:

答案 0 :(得分:0)

我已经使用了BeautifulSoup而不是HTMLParser -

soup = BeautifulSoup(pageContent)
links = soup.find_all('a')
相关问题