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)      #requests.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='https://www.qiushibaike.com/'
    resqonse=requests.get(url,headers=headers)
    #获取页面资源
    page_text=resqonse.text

    #构造一个etree对象
    tree=etree.HTML(page_text)
    #xpath的表达式,得到想要的数据
    #在浏览器的开发者工具中预览节点信息,在Chrome浏览器中可直接选择节点,copy xpath表达式

    #从根节点开始,获取body下面的直属div,返回一个对象列表
    # res=tree.xpath('/html/body/div')
    #获取根节点下面的,所有的div节点
    # 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)

具体示例:

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM