Python之HTML内容解析
1、引⼊
在Python的爬⾍项⽬中,通常需要解析获取到的页⾯内容,得到特定节点中的数据。所以需要解析⼯具,可以选择:正则式,bs4,xpath 等。在这⾥我们选择使⽤Xpath对HTML内容解析
XPath,全称XML Path Language,即XML路径语⾔,可以在XML,HTML⽂档中查信息的语⾔,XPath的选择功能⼗分强⼤,提供了⾮常简明了的路径选择表达式。
xpath解析:最常⽤且最便捷⾼效的⼀种解析⽅式,也具有通⽤性。
xpath解析原理:
1. 实例化⼀个etree的对象,把需要解析的页⾯源码数据加载到该对象中
2. 调⽤etree对象中的xpath⽅法,结合xpath的表达式实现标签定位和内容的捕获
2、使⽤
安装第三⽅库 pip install lxml
引⼊etree对象:from lxml import etree
加载HTML数据:
1. 本地⽂件加载 etree.parse(file_url)
2. ⽹络资源加载 etree.HTML(html_text) #
返回的是⼀个对象,可以调⽤xpath⽅法
xpath表达式
在Chrome浏览器中,可以直接选择节点,复制xpath表达式
1. /:表⽰整个资源的根节点开始定位,表⽰的是⼀个层级
2. //:表⽰多个层级,可以从任意位置开始
3. 属性定位://div[@class='attrName'] #定位到div标签,且标签class='attrName',
4. 索引定位://div[@class='attrName']/p[2] #div节点的下⼀级第⼆个p元素节点,索引定位是1开始
5. 取值:/text() #获取标签的直系⽂本内容 //text()获取标签下⾯所有节点的⽂本类容
6. 取属性值:/@attrName #可以取对应节点下⾯的属性值
import requests
from lxml import etree
# 设置请求载体
headers = {
# 在浏览器中,network查看
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36',
}
#读取糗事百科的内容
def get_zhifu_rank():
url='www.qiushibaike/'
(url,headers=headers)
#获取页⾯资源
page_
#构造⼀个etree对象
tree=etree.HTML(page_text)
#xpath的表达式,得到想要的数据
#在浏览器的开发者⼯具中预览节点信息,在Chrome浏览器中可直接选择节点,copy xpath表达式
#从根节点开始,获取body下⾯的直属div,返回⼀个对象列表
# res=tree.xpath('/html/body/div')
#获取根节点下⾯的,所有的div节点
html实现用户注册登录代码# res=tree.xpath('/html//div')
#从根节点开始,通过索引的形式,获取
# res = tree.xpath('/ html / body / div[2] / div[1] / div[1]')
#从根节点开始,通过属性名称获取,如果属性名唯⼀,则中间层可以直接 //表⽰
#res = tree.xpath('/html//div[@class="index-head"]')
# res = tree.xpath('/html//div[@id="index_header"]')
#不从根节点开始查
#从任意节点开始查询div,即查询所有的div节点
# res = tree.xpath('//div') #res = tree.xpath('/html//div')
#查看节点中class名字为index-head的div节点
# res = tree.xpath('//div[@class="index-head"]')
#查询class=col0的div下⾯的所有li节点
# res=tree.xpath('//div[@class="col0"]//li')
#print(len(res),res)
#取值
#取出所有的div中直属值(不是div直属的值不取)
# res = tree.xpath('/html//div/text()') #228个
#取出div中的所有下级的值
#res = tree.xpath('/html//div//text()') #645个
#res = tree.xpath('//div[@class="col0"]//li[3]//text()[0]')
#你可以到相应的节点,然后取值就好
#取属性值
#取出class为col0的div下⾯的第三个li标签中的a标签直属的href的属性值# res = tree.xpath('//div[@class="col0"]//li[3]/a/@href')
#标签中的所有href值
# res = tree.xpath('//div[@class="col0"]//li//@href')
# print(len(res), res)
#可以设置多个节点
#得到li标签的对象列表
# li = tree.xpath('//div[@class="col0"]//li')
#具体对象中的值,可以循环取值 ./表⽰在当前⽬录下
# res = li[2].xpath('./a/@href')
# print(len(res), res)
具体⽰例:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论