-
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所对应的属性值