Lxml库是基于lbxml2的XML解析库的Python封装。

作用:使用Xpath语法解析定位网页数据。

Lxml库的安装

windows系统下的安装:
Python爬虫之Lxml库与Xpath语法
#pip安装
pip3 install lxml

#wheel安装
#下载对应系统版本的wheel文件:http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml
pip3 install lxml-4.2.1-cp36-cp36m-win_amd64.whl
Python爬虫之Lxml库与Xpath语法
linux下安装:
yum install -y epel-release libxslt-devel libxml2-devel openssl-devel

pip3 install lxml
 
 

 Lxml库使用

修正HTML代码

Lxml为XML的解析库,很好的支持了HTML文档的解析功能。

from lxml import etree
text="""
one
"""
html1=etree.HTML(text)
print(html1)

etree库把HTML文档解析为Element对象,可以通过以下代码输出解析过的HTML文档

from lxml import etree
text="""
one
"""
html1=etree.HTML(text)
print(html1)
result=etree.tostring(html1)
print(result)
Python爬虫之Lxml库与Xpath语法

通过运行程序我们可以看出,Lxml库自动补全了HTML代码。

 
读取HTML文件

通过PyCharm新建一个.html文件

<!DOCTYPE html>
<html lang="en">
<head>
<title>flower</title>
</head>
<body>
one
</body>
</html>
from lxml import etree
html1=etree.parse('flower.html')
result=etree.tostring(html1,pretty_print=True)
print(result)

 

解析HTML文件
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/70.0.3538.102 Safari/537.36 Edge/18.18362'
}
res=requests.get('https://book.douban.com/',headers=headers)
html=etree.HTML(res.text)
result=etree.tostring(html)
print(result)

Xpath语法

节点关系

父节点

每个元素及其属性都有一个父节点,例如

<user>
     <name>xiao ming</name>
     <sex>JK. Rowling</sex>
     <id>34</id>
     <goal>89</goal>
</user>

其中user元素为name,sex,id,goal元素的父节点

子节点

元素节点可有0个,一个,或者多个自节点,在上述例子中name,sex,id,goal为user的子节点。

同胞节点

name,sex,id,goal互为同胞节点,即同胞节点有相同的父亲节点

先辈节点

先辈节点为某元素的父节点和父节点的父节点

后代节点

某节点的子节点和子节点的子节点

节点选择

Xpath使用路径表达式在XML文档中选取节点,节点是通过沿着路径或者step来选取的

Python爬虫之Lxml库与Xpath语法

 

使用技巧

Python爬虫之Lxml库与Xpath语法

 

 Python爬虫之Lxml库与Xpath语法

Python爬虫之Lxml库与Xpath语法

import requests
from lxml import etree
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400'
}
#//*[@]/div/div[1]/div[1]/div[2]/div/div/ul[2]/li[1]/div[1]/a/img
res=requests.get('https://book.douban.com',headers=headers)
selector=etree.HTML(res.text)
img=selector.xpath('//*[@>)[0]
print(img)

通过/text()获取标签内的文字信息

Python爬虫之Lxml库与Xpath语法