xpath

xpath知识储备

-1.下载:pip install lxml
-2.导包:from lxml import etree
-3.创建etree对象进行指定对象的解析
-本地:etree=etree.parse('本地文件路径')
etree.xpath('xpath表达式')
-网络:etree=etree.parse('网络请求到的页面数据')
etree.xpath('xpath表达式')

xpath常用表达式

- 属性定位:
找到class属性为song的div标签
//div[@class="song"]
- 层级&索引定位
找到class为tang的div直系子标签下的ul下的第二个li下的a
//div[class="tang"]/ul/li[2]/a
- 逻辑定位
找到href属性为空且class属性为do的a标签
//a[@href="" and @class="du"]
- 模糊匹配
//div[contains(@class, "ng")] 包含
//div[starts-with(@class,"ta")] 以。。。开头
- 取文本
/text() 表示获取某个标签下的文本内容
//text() 表示获取某个标签下的文本内容和所有子标签的文本内容
//div[@class="song"]/p[1]/text()
//div[@class="tang"]//text()
- 取属性
//div[@class="tang"]//li[2]/a/@href

注意: 返回值都是列表

练习

  • 需求:用xpath对段子网的内容和标题进行解析,持久化存储
import requests
from lxml import etree

#1.指定url
url='https://ishuo.cn/joke/'

#2.发起请求
# 自定义请求头信息
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 6.3; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'

}
response = requests.get(url,headers=headers)
#3.获取数据
page_text=response.text
#4.解析数据
tree = etree.HTML(page_text)
# 获取所有的li标签  返回列表中是element类型对象,可以继续调用xpath对其中的内容进行解析
li_list = tree.xpath('//div[@id="list"]/ul/li')
f = open('./段子.txt','w',encoding='utf-8')
for li in li_list:
    title = li.xpath('./div[@class="info"]/a/text()')[0]
    content = li.xpath('./div[@class="content"]/text()')[0]
    
    #5.持久化存储
    f.write(title+'
   '+content+'

')
print('写入完成')

xpath插件

可以直接将表达式作用于浏览器当中,测试通过再用到代码中。

 - 安装:更多工具》》拓展程序》》开启开发者模式》》将网上下载的xpath插件拖动到页面
 -打开关闭的快捷键:ctrl+shift+x
原文地址:https://www.cnblogs.com/yuliangkaiyue/p/10001701.html