python 解析html文档模块HTMLPaeser

python中,有三个库可以解析html文本,HTMLParser,sgmllib,htmllib。他们的实现方法不通,但功能差不多。这三个库中 提供解析html的类都是基类,本身并不做具体的工作。他们在发现的元件后(如标签、注释、声名等),会调用相应的函数,这些函数必须重载,因为基类中不作处理。

用Python中自带的HTMLPaeser模块,解析下面的HTMl文件

要求:1、获取到每一个漏洞的名称,CVE号,风险值

2、显示每一个漏洞单独显示,不要堆叠在一起

3、只获取高风险的漏洞

<html>
<head>
<title>search</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
<LINK href="include/bbs.css" rel=stylesheet>
</head>
<body bgcolor="#ffffff" text="#000000" leftmargin="0" topmargin="0"><br>

<div id="Layer2" style="position:absolute; left:25%; top:99px; width:71%; height:265px; z-index:2; overflow: auto" class="bordernobackground">

    <table width="100%" border="0" height="29" align="center"  cellspacing="1" cellpadding="1" bordercolordark="#FFFFFF" bordercolorlight="#000000" class="a2">

	  <tr class="a1" height="22">
        <td width="9%" class="a8">ID</td>
        <td class="a8">检测名称</td>
        <td width="14%" class="a8">CVE号</td>
        <td width="20%" class="a8">检测类别</td>
        <td width="15%" class="a8">风险级别</td>
      </tr>

	  <tr class="a1" height="22">
        <td class="a9">1</td>
        <td class="a9">
          <a href="javascript:openwindow(0);">
          FTP缓冲区溢出</a>
        </td>
        <td class="a9">
         <a href=‘http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-1999-0789‘ target=‘_blank‘> CVE-1999-0789</a>

        </td>
        <td class="a9">
          FTP测试
        </td>
        <td class="a9">
          <font color=#FF00FF>高风险</font>
        </td>
      </tr>

	  <tr class="a1" height="22">
        <td class="a9">2</td>
        <td class="a9">
          <a href="javascript:openwindow(2);">
          AFS客户版本</a>
        </td>
        <td class="a9">
        </td>
        <td class="a9">
          信息获取测试
        </td>
        <td class="a9">
          <font color=#00CC00>信息</font>
        </td>
      </tr>

	  <tr class="a1" height="22">
        <td class="a9">1</td>
        <td class="a9">
          <a href="javascript:openwindow(1);">
          ACC 路由器无需认证显示配置信息</a>
        </td>
        <td class="a9">
         <a href=‘http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-1999-0383‘ target=‘_blank‘> CVE-1999-0383</a>

        </td>
        <td class="a9">
          网络设备测试
        </td>
        <td class="a9">
          <font color=#FFCC00>中风险</font>
        </td>
      </tr>

	  <tr class="a1" height="22">
        <td class="a9">3</td>
        <td class="a9">
          <a href="javascript:openwindow(17);">
          Knox Arkeia 缓冲区溢出</a>
        </td>
        <td class="a9">
         <a href=‘http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-1999-1534‘ target=‘_blank‘> CAN-1999-1534</a>

        </td>
        <td class="a9">
          杂项测试
        </td>
        <td class="a9">
          <font color=#FF00FF>高风险</font>
        </td>
      </tr>

</table>

</div>
</body>
</html>

Python程序

html_get.py

class CustomParser(HTMLParser.HTMLParser):
    ‘‘‘
    定义一个新的HTMLParser类,覆盖用到的方法
    ‘‘‘
    cve_list = []
    sigle_cve = []
    selected = (‘table‘, ‘div‘, ‘tr‘, ‘td‘, ‘a‘,‘font‘)  #需要解析的标签
    selected_a = [‘table/div/tr/td/a‘]  #需要获取标签a数据的路径
    selected_font = [‘table/div/tr/td/font‘] #需要获取标签font数据的路径
    def reset(self):
        HTMLParser.HTMLParser.reset(self)
        self._level_stack = []

    def handle_starttag(self, tag, attrs):
        if tag in CustomParser.selected:
            self._level_stack.append(tag)
    def handle_endtag(self, tag):
        if self._level_stack and tag in CustomParser.selected and tag == self._level_stack[-1]:
            self._level_stack.pop()
    def handle_data(self, data):
        #我们将需要获取的数据放到一个list中,同时每一个漏洞的数据会放到一个小的listz中
        #如[[名称,CVE,风险],[名称,CVE,风险]],这里拿到的是全部HTML中的数据
        if "/".join(self._level_stack) in CustomParser.selected_a and not CustomParser.sigle_cve:
            print self._level_stack, data.decode(‘gbk‘).encode(‘utf-8‘)
            CustomParser.sigle_cve.append(data.decode(‘gbk‘).encode(‘utf-8‘).strip())
        elif "/".join(self._level_stack) in CustomParser.selected_a:
                print self._level_stack, data.decode(‘gbk‘).encode(‘utf-8‘).strip()
                CustomParser.sigle_cve.append(data.decode(‘gbk‘).encode(‘utf-8‘).strip())
        elif "/".join(self._level_stack) in CustomParser.selected_font and CustomParser.sigle_cve:
            print self._level_stack, data.decode(‘gbk‘).encode(‘utf-8‘).strip()
            CustomParser.sigle_cve.append(data.decode(‘gbk‘).encode(‘utf-8‘).strip())
            CustomParser.cve_list.append(CustomParser.sigle_cve)
            CustomParser.sigle_cve = []
if __name__ == ‘__main__‘:
    ‘‘‘
    读取,判断是否为高风险,是的打印出来
    ‘‘‘
    try:
        fd = open(‘test.html‘,‘r‘)
    except Exception,error:
        print error
    html_string = fd.read()
    ht = CustomParser()
    ht.feed(html_string)
    get_list = ht.cve_list
    for item in get_list:
        if item[-1] == ‘高风险‘:
            print item
    fd.close()

参考链接:http://crquan.blogbus.com/logs/8269701.html

python 解析html文档模块HTMLPaeser

时间: 2024-11-05 11:27:08

python 解析html文档模块HTMLPaeser的相关文章

python 解析docx文档的方法,以及提取插入的文本对象和图片

首先安装docx模块,通过pip install docx或者在docx官方链接上下载安装都可以 下面来看下如何解析docx文档:文档格式如下 有3个部分组成 1 正文:text文档 2 一个表格. 3一个插入的文件对象.4 一个图片 这4个部分是我们在docx文档中最常见的几种格式.解析代码如下 import docx def docx_try():     doc=docx.Document(r'E:\py_prj\test.docx')     for p in doc.paragraph

python解析PDF文档

1.安装 pip install pdfminer3k 2.  python读取PDF文档代码分析 PDF格式不是规范格式. 尽管它被叫做"PDF文档", 但并不像word或者html文档.PDF的表现更像一张图片.PDF更像是在一张纸的各个准确的位置上把内容都摆放出来.大部分情况下,没有逻辑结构,比如句子或段落,并且不能自适应页面大小的调整.PDFMiner尝试通过猜测它们的布局来重建它们的结构,但是不保证一定能工作.我知道这样很难看,但是,PDF确实不够规范. 下面这个图片是使用流

python解析HTML文档

1.使用HTMLParse解析 HTMLParser是Python自带的模块,使用简单,能够很容易的实现HTML文件的分析.本文主要简单讲一下HTMLParser的用法. 使用时需要定义一个从类HTMLParser继承的类,重定义函数: handle_starttag( tag, attrs) handle_startendtag( tag, attrs) handle_endtag( tag) 来实现自己需要的功能. tag是的html标签,attrs是 (属性,值)元组(tuple)的列表(

使用 Python 模块&mdash;&mdash; HTMLParser 解析 HTML 文档元素

这个文档定义了一个 HTMLParser 类作为解析 HTML 文档的基础.HTMLParser 类的实例可以存储并调用方法来处理 HTML 标签和数据.我们一般通过建立一个 HTMLParser 的子类然后覆盖它的方法来实现我们想要的操作.HTMLParser 有很多方法,一般我们只需要覆盖下面几个方法: HTMLParser.handle_starttag(tag, attrs) #遇到一个开始标签时就会执行这个方法 #tag 是遇到的标签,attrs attrs是 (属性,值)元组(tup

python+selenium自动化软件测试(第12章):Python读写XML文档

XML 即可扩展标记语言,它可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语言进 行定义的源语言.xml 有如下特征: 首先,它是有标签对组成:<aa></aa> 标签可以有属性: <aa id=’123’></aa> 标签对可以嵌入数据: <aa>abc</aa>Python对XML文档读写常用有几个模块: (1) xml.etree.ElementTree ElementTree就像一个轻量级的DOM,具有方便友好的A

四种生成和解析XML文档的方法详解

众所周知,现在解析XML的方法越来越多,但主流的方法也就四种,即:DOM.SAX.JDOM和DOM4J 一.介绍及优缺点分析 1. DOM(Document Object Model) DOM是用与平台和语言无关的方式表示XML文档的官方W3C标准.DOM是以层次结构组织的节点或信息片断的集合.这个层次结构允许开发人员在树中寻找特定信息.分析该结构通常需要加载整个文档和构造层次结构,然后才能做任何工作.由于它是基于信息层次的,因而DOM被认为是基于树或基于对象的. [优点]      ①允许应用

浅谈用java解析xml文档(四)

继续接上一文,这一阵子因为公司项目加紧,导致最后一个解析xml文档的方式,还没有总结,下面总结使用dom4J解析xml. DOM4J(Document Object Model for Java) 使用dom4j解析,个人认为是四种解析方式里面最方便的一种,DOM4J是一个非常非常优秀的Java XML API,具有性能优异.功能强大和极端易用使用的特点,同时它也是一个开放源代码的软件.如今你可以看到越来越多的Java软件都在使用DOM4J来读写XML,特别值得一提的是连Sun的JAXM也在用D

浅谈用java解析xml文档(三)

接上一篇,本文介绍使用JDOM解析xml文档, 首先我们还是应该知道JDOM从何而来,是Breet Mclaughlin和Jason Hunter两大Java高手的创作成果,2000年初, JDOM作为一个开放源代码项目正式开始研发.JDOM是一种解析XML的Java工具包. JDOM基于树状结构,利用纯JAVA技术对XML文档实现解析.生成.序列化及其它操作. 我们从以下步骤开始解析: (1).通过JDOM的API创建一个SAXBuilder的对象 SAXBuilder saxBuilder

Java 解析XML文档

一.解析XML文档方式: 1.DOM方式:将整个XML文档读取到内存中,按照XML文件的树状结构图进行解析. 2.SAX方式:基于事件的解析,只需要加载XML中的部分数据,优点是,占用资源更少,内存消耗小. XML文档: <?xml version="1.0" encoding="UTF-8"?> <students> <student> <name>张三</name> <age>20</