HTMLParser是Python内置的专门用来解析HTML的模块。利用HTMLParser,我们可以剖析出一段HTML里面的标签、数据等,是一种处理HTML的简便路子。我们先来看一个官方的例子。
HTMLParser模块官方例子
从上述代码中可以看出,HTMLParser模块来自html.parser,导包时要格外把稳。利用HTMLParser时,我们须要定义一个继续自HTMLParser的子类,并根据须要重写HTMLParser父类中的成员方法。例子中利用的各方法浸染如下:
handle_starttag(tag, attrs):识别HTML的开始标签,例如<html>、<title>、<body>、<div>等。
handle_endtag(tag):识别HTML的结束标签,例如</html>、</body>、</div>、</p>等。
handle_data(data):识别HTML标签内容,例如“<p>Test</p>”中的Test。
handle_startendtag(tag, attrs):识别没有结束标签的HTML标签,例如<img />等。
handle_comment(data):识别HTML中的注释内容,一样平常是“<!-- 注释 -->”中的注释内容。
HTMLParser采取的是一种事宜驱动的模式,HTMLParser找到一个特定的标记时,它会去调用一个用户定义的函数,以此来关照程序处理。
我们可以利用这些方法来实现HTML解析干系的功能。个中参数tag表示的是HTML标签,attrs是一个列表,列表元素为一个个“(属性,值)”形式的元组。HTMLParser会自动将tag和attrs都转为小写,解析时调用feed( )方法,把待解析的HTML字符串传入即可。
HTMLParser模块的大略运用现在有以下网页,我们须要获取出里面的新闻文本内容。
待要求网页
首先便是获取该网页的HTML。经由上节内容的学习,我们很随意马虎想到利用urllib库要求获取这个网页的HTML。
获取网页HTML
代码很大略,利用urlopen( )方法,传入url即可。此时,我们已经得到了全体网页的HTML,但是我们要获取的是新闻内容,显然此时的HTML中有太多我们不须要的东西。
不雅观察全体网页HTML,我们创造新闻内容是包含在一个div中的。
新闻内容干系HTML
我们可以利用正则表达式re模块将包含新闻内容的这个div提取出来。
提撤消息内容干系的HTML
新闻内容的div格式紧张是:<div class=\公众article-content\"大众>...</div>。由于该div下嵌套了其他div,如果我们直策应用r'<div class=\\"大众article-content\\"大众>(.?)</div>'进行正则提取,会创造不才一个</div>处就截断了。为了精确提取所有新闻内容干系的HTML,我们须要在</div>前加一个</p>,以担保是在新闻内容结束的</div>处截断。
此时,我们已经得到了新闻内容干系的HTML。现在还剩末了一部,便是把HTML标签去掉,保留新闻文本内容。这一步,我们就可以利用HTMLParser来实现了。
HTMLParser提撤消息内容
我们定义一个继续自HTMLParser的子类,然后重写handle_data(data)方法获取当前HTML中的文本内容即可。由于我们定义的私有变量__text是通过一个列表来逐条吸收新闻内容的,以是我们在类中定义一个获取私有变量__text的方法,并将列表转换成字符串。至此,我们已经获取到了新闻的文本内容。
然而,当前文本内容一整段在一起,看起来并不雅观观,与实际分段的新闻文本内容也有差别。我们可以利用HTMLParser来美化新闻内容。我们知道,网页上的新闻内容是通过“\n”、“\t”、“<br/>”等分外符号或标签进行间隔和分段的。因此,我们只须要在解析时更换掉这些分外符号和标签即可。
更换分外符号和标签
重写handle_data(data)方法,识别文本的同时更换掉“\t”、“\r”、“\n”等分外字符;重写handle_starttag(tag, attrs)方法,识别出<p>、<br>进行更换;重写handle_startendtag(tag, attrs)方法,识别出<br/>进行更换。再次运行程序,可以看到,新闻内容进行了分段,看起来就都雅多了。
上述过程实现了一个非常大略的爬虫,爬撤消息网页,提撤消息内容。当然,由于我们目前还没先容其他第三方库,实现起来还不足灵巧,例如获撤消息内容的div我们现在只能通过正则表达式实现,但实际上,如果利用lxml(etree、xpath)、BeautifulSoup等第三方库会更大略实用。
总结以上内容先容了Python内置的HTML解析库HTMLParser模块,须要重点节制HTMLParser类常用方法的浸染,能够重写这些方法进行自定义解析。感谢大家的支持与关注,欢迎一起学习互换~