xpath(xml path language)是一门在xml和html文档查找信息的语言,可用来在xml和html文档中对元素和属性进行遍历。
选取节点:
xpath选取路径表达式来选取xml文档的节点和节点集。
表格1
表达式 | 描述 | 示例 | 结果 |
---|---|---|---|
nodename | 选取此节点的所有子节点 | bookstore | 选取bookstore下所有子节点 |
/ | 如果在最前面就表示从根节点选取。否则选取某节点下的某个节点 | /bookstore | 选取bookstore下所有子节点 |
@ | 选取某个节点属性 | //book[@price] | 选取所有拥有price属性的book节点。 |
谓语:
谓语用来查找某个特定的节点或者包含某个指定的值的节点,被嵌在方括号里。
在下面的表格中,我们列出了带有谓语的一些路径表达式,以及表达式的结果,注意在xpath下标从1开始。
表格2
路径表达式 | 描述 |
---|---|
/bookstore/book[1] | 选取bookstore下的第一个子元素 |
/bookstore/book[last()] | 选取bookstore下的最后一个子元素 |
/bookstore/book[position()< 3] | 选取bookstore下的前面两个子元素 |
//book[@price] | 选取拥有price属性的book节点 |
//book[@price=10] | 选取所有price属性等于10的book节点 |
通配符:
表示通配符
表格3
通配符 | 描述 | 示例 | 结果 |
---|---|---|---|
* | 匹配任意节点 | /bookstore/* | 选取bookstore下的所有子元素 |
@* | 匹配节点中的任意属性 | //book[@* ] | 选取所有带有属性的book元素 |
选取多个路径:
通过使用"|"运算符,可以选取若干个路径。
实例如下:
//bookstore/book | //book/title
选取所有book元素以及book元素下所有的title元素
运算符:
表格4
运算符 | 描述 | 示例 | 返回值 |
---|---|---|---|
div | 除法 | 8div4 | 2 |
= | 等于 | price=11 | 如果price是9.8则返回ture,否则返回false |
!= | 不等于 | price!=11 | 2 |
< | 小于 | price<11 | 如果price是9.8则返回ture,否则返回false |
> | 大于 | price>11 | 如果price是12则返回ture,否则返回false |
<= | 小于等于 | price<=11 | 如果price是1则返回ture,如果price是8则返回false |
>= | 大于等于 | price>=11 | 如果price是12则返回ture,如果price是8则返回false |
or | 或 | price>11 or price<5 | 如果price是12则返回ture,如果price是6则返回false |
and | 与 | price>11 and price<15 | 如果price是12则返回ture,如果price是8则返回false |
//div[contains(@class,'job_detail')]
lxml是一个html/xml的解析器,主要的功能是如何解析和提取HTML/xml数据。
lxml安装
可使用pip安装:pip install lxml
如果出现安装错误,则需要将目标路径写上
pip install --target=d:\python\python37\lib\site-packages lxml
可以利用lxml来解析html代码,并且在解析html代码时如果不规范,会自动补全。示例代码如下:
#使用lxml的etree库
#encoding utf-8
from lxml import etree
text="""
百度招聘
"""
def parse_text():
html = etree.HTML(text)
print(etree.tostring(html, encoding='utf-8').decode('utf-8'))
def parse_file():
html=etree.parse("renrer.html")#直接使用parse会报错,说明html不规范需要自己创建解析器
print(etree.tostring(html, encoding='utf-8').decode('utf-8'))
def parse_lagou_file():
parse=etree.HTMLParser(encoding='utf-8')
html=etree.parse("renrer.html",parser=parse)
print(etree.tostring(html,encoding='utf-8').decode('utf-8'))
if __name__=='__main__':
parse_lagou_file()
trs=html.xpath("//tr[position()>1]")
a=html.xpath("//a/@href")
#获取a便签的href属性对应的值
text=html.xpath(".//tr[4]/text()")
import requests
from lxml import etree
#第一步爬取豆瓣网页数据
url="https://movie.douban.com/cinema/nowplaying/shanghai/"
header = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36"}
response=requests.get(url,headers=header)
reqt=response.text
#print(response.text) #第二步处理数据
html=etree.HTML(reqt)
ul=html.xpath("//ul[@class='lists']")[0]
lis=ul.xpath("./li")
movies=[]
for li in lis:
title=li.xpath("@data-title")[0]
score=li.xpath("@data-score")[0]
release=li.xpath("@data-release")[0]
duration=li.xpath("@data-duration")[0]
href=li.xpath(".//li[@class='poster']/a/@href")[0]
movie={
'title':title,
'score':score,
'release':release,
'duration':duration,
'href':href
}
movies.append(movie)
print(movies)
#print(etree.tostring(ul,encoding='utf-8').decode("utf-8"))