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获取电影名《肖申克的救赎》:
    已使用requests获取到网页数据
  • 导入etree后,使用etree对返回的网页数据(代码中的web_data)进行解析并查找电影名。
from lxml import etree
  1. 使用etree.HTML()解析web_data,并保存到web_html变量中,注意需使用.text取出web_data再传入.HTML()。
    通过打印web_html,可见其为Element对象,类型为html,后续即可以web_html为基础进行元素查找。
    etree.HTML()解析web_data
web_html = etree.HTML(web_data.text)
  1. 豆瓣Top250电影网站获取电影名《肖申克的救赎》的XPath。
    进入网页后按 Ctrl + Shift + C 选中电影名,右侧检查栏中找到电影名的<span></span>元素,右键 - Copy - Copy XPath。
    复制XPath
  2. 对第1点中的web_html变量使用.xpath()方法,传入第2点中复制的XPath路径,保存至变量movie_name。
    第一行print打印出movie_name的类型(type),可见是列表(list)类型,故需要使用第二行print中的movie_name[0]取出结果,可见其为Element类型对象,故需要使用第三行print中的movie_name[0].text获取对象中的文本。
    查看结果
  3. 当然,我们也可以获取此网页所有的电影名。对比第二部电影《霸王别姬》的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]'
  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)

获取到25个Element元素即25部电影信息

  • 完整代码如下:
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。
  • 学如逆水行舟,不进则退!
  • (ง •̀-•́)ง
Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐