xpath解析:最常用且最便捷高效的一种解析方式,具有通用性
xpath解析的原理: 一、实例化一个etree对象,且需要将被解析的页面源码数据加载到该对象中 二、调用etree对象中的xpath方法结合着xpath表达式实现标签定位和内容的捕获
环境的安装:pip install lxml
如何实例化一个etree对象:from lxml import etree 一、将本地中的html文档中的源码数据加载到etree对象中:etree.parse(filePath) 二、可以将从互联网上获取的源码数据加载到该对象中:etree.HTML(‘page_text’) 三、xpath(‘xpath表达式’)
xpath表达式 /:表示的是从根节点开始定位,第一个/表示从根节点开始定位,其余/表示层级 //:表示多个层级,可以表示从任意位置开始定位 属性定位://div[@class=“song”]、tag[@attrName=“attrvalue”] 索引定位://div[@class=“song”]/p[3] 索引从1开始 取文本:1./text() 获取标签中直系的文本内容 2.//text() 获取标签下所有的文本内容 取属性:/@attrName ==>img/src 获取属性值
import requests from bs4 import BeautifulSoup import re from lxml import etree headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36' } if __name__ == "__main__": # 实例化好了一个etree对象,且将被解析的源码加载到了该对象中 tree = etree.parse('test.html') # 传入本地html # 根据层级定位捕获内容 # r = tree.xpath('/html/head/div') # 函数返回的是一个列表,并不是title对应的html内容,而实一个element类型的对象 # r = tree.xpath('/html//div') # r = tree.xpath('//div') # 三个表达式对应的结果相同,//表示从任意位置开始定位 # r = tree.xpath('//div[@class="song"]') # 属性定位,获取class=song的一个div标签 # r = tree.xpath('//div[@class="song"]/p[3]') # 获取点三个p标签,索引从1开始 # r = tree.xpath('//div[@class="tang"]//li[5]/a/text')[0] # 获取a标签里面的文本数据,只能获取直系标签里的文本内容,如果文本存在于其子标签,则无法获取 # r = tree.xpath('//li[7]//text()') # 获取标签下所有的文本内容 r = tree.xpath('//div[@class="song"]/img/@src') # 获取src所对应的属性值