- 专栏《Python爬虫初级》
1、概念
- etree为Python的lxml库下的一个包,lxml.etree提供了原ElementTree API定义的接口,以及一些简单的enhancements。
- etree可对HTML元素进行类似BeautifulSoup的查找,不过主要是基于XPath路径,而BeautifulSoup主要基于Selector路径。
2、安装
- 安装lxml库(在第三章中已经提到过),完成后可从lxml中导入
pip install lxml
etree主要函数:
- etree.HTML():解析字符串格式的HTML文档对象,将字符串参数变为Element对象,以便使用xpath()等方法;
- etree.tostring():将Element对象转换成字符串;
- etree.fromstring():将字符串转换成Element对象。
3、代码
- 以第二章的豆瓣Top250电影网站爬虫为例,演示etree获取电影名《肖申克的救赎》:
- 导入etree后,使用etree对返回的网页数据(代码中的web_data)进行解析并查找电影名。
from lxml import etree
- 使用etree.HTML()解析web_data,并保存到web_html变量中,注意需使用.text取出web_data再传入.HTML()。
通过打印web_html,可见其为Element对象,类型为html,后续即可以web_html为基础进行元素查找。
web_html = etree.HTML(web_data.text)
- 从豆瓣Top250电影网站获取电影名《肖申克的救赎》的XPath。
进入网页后按 Ctrl + Shift + C 选中电影名,右侧检查栏中找到电影名的<span></span>元素,右键 - Copy - Copy XPath。 - 对第1点中的web_html变量使用.xpath()方法,传入第2点中复制的XPath路径,保存至变量movie_name。
第一行print打印出movie_name的类型(type),可见是列表(list)类型,故需要使用第二行print中的movie_name[0]取出结果,可见其为Element类型对象,故需要使用第三行print中的movie_name[0].text获取对象中的文本。 - 当然,我们也可以获取此网页所有的电影名。对比第二部电影《霸王别姬》的XPath路径:
Xiao='//*[@id="content"]/div/div[1]/ol/li[1]/div/div[2]/div[1]/a/span[1]'
Wang='//*[@id="content"]/div/div[1]/ol/li[2]/div/div[2]/div[1]/a/span[1]'
- 可发现唯一的不同即为“ li[n] ”,第一部电影n为1,第二部电影n为2,故若去掉“ [n] ”,则可以获取所有的电影名(图中获取到网页中25部电影的Element对象,使用for循环对每个对象进行.text即可取出电影名):
movie_name = web_html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]')
print(movie_name)
- 完整代码如下:
import requests
from lxml import etree
Headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.77 Safari/537.36'
}
Url = 'https://movie.douban.com/top250'
web_data = requests.get(Url, headers=Headers)
web_html = etree.HTML(web_data.text)
movie_name = web_html.xpath('//*[@id="content"]/div/div[1]/ol/li/div/div[2]/div[1]/a/span[1]')
# print(type(movie_name))
# print(movie_name[0])
# print(movie_name[0].text)
print(movie_name)
4、总结
- lxml库中的etree也是较为常用的解析HTML的工具,其主要使用XPath进行元素查找,读者也可移步XPath语法-菜鸟教程进行学习。不过在XPath与Selector路径的表达上,由于Selector可直接使用“ 元素名.class ”的形式(如div.reviewCss)定位到元素,表达上十分简洁,故在简洁性上推荐新手使用BeautifulSoup。
- 学如逆水行舟,不进则退!
- (ง •̀-•́)ง