首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

python爬虫初探:HTML解析器

上一篇谈到,HTML下载器l使用requests模块下载网页,并返回其内容,那么,其返回的内容究竟是什么呢?我们以贾总裁的百度百科词条为例来进行说明:

在终端中进入python环境并使用requests下载网页内容:

import requests import codecs #codecs可以很方便地对文本文件进行编码和解码 user_agent = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.108 Safari/537.36' headers = {'User-Agent':user_agent} #由于我的终端不支持汉语,下面链接中的汉字在复制的过程中已经被转码,不要紧 url = "https://baike.baidu.com/item/%E8%B4%BE%E8%B7%83%E4%BA%AD" r = requests.get(url, headers = headers) r.encoding = '

tf-8' #使用utf-8对内容编码 f = codecs.open('/home/***/test.txt', 'w', encoding='utf-8') f.write(r.text) f.close()

使用文本编辑器(在这里是Atom)打开上述test.txt文件:

可以看到,r.text中的内容正是该词条的html代码(对于大多数静态网页来说是这样的),在谷歌chrome浏览器中按F12功能键k也可以看到该网页的源代码。HTML解析器的作用就是从这标签与文字齐飞的代码中抽丝剥茧,将有用的信息提取出来。

我们接下来想要提取的信息有:

指向其它词条的链接(如下图)

该词条的简介(如下图)

通过对比不同词条的网页代码,我们可以很容易地看出他们都具有一定的相似性,如指向其它词条的链接都是"/item/..."的形式,使用正则表达式很容易jd地j就可以把这些内容给匹配出来。

然而,python往往能给我们提供更加便利的工具。BeautifulSoup就是一个专门用来从html和xml文档中提取数据的库,现在的版本是bs4。除了BeautifulSoup之外,python还具有一些其它的库,如HTMLParser等,作用都差不多。解析器结合正则表达式,很容易将我们所需要的内容提取出来。

首先安装BeautifulSoup:

$pip install beautifulsoup4

在python环境下导入字符串,创建BeautifulSoup对象:

from bs4 import BeautifulSoup soup = BeautifulSoup(html_str, 'lxml', from_encoding='utf-8')

BeautifulSoup可以将复杂的html文档转化成树形结构,每个节点都是pyhton对象,所有的对象可以归纳为4种:

Tag

NavigableString

BeautifulSoup

Comment

Tag和NavigableString是我们最常使用的两种对象,具体选择对象的方法规则颇多,请初学者参考这篇博文Python爬虫利器二之Beautiful Soup的用法。(同时请参考正则表达式学习正则表达式的用法)

根据上图我们可以看到,HtmlParser将要接收一个字符串,输出data和新采集到的一些urls。之前写过的add_new_urls()函数接受一个可迭代对象,所以这里新的urls我们采用集合的形式(也可采用列表的形式)返回,data采用字典的形式存储并返回。

此外,我们观察到,词条内容中含有的链接为"/item/..."的形式,这并不是一个完整的url,要在前面加上“https://baike.baidu.com”进行补全,利用urlparse模块可以很方便地完成这个任务(当然也可以使用拼接字符串的方式)。

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180129A1EF1X00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券