#内容为视频笔记及个人理解,若有错误还望各位大佬指正
xpath
xpath 通过将源码实例化为一个对象来进行处理
如何实例化一个对象
-
通过将本地的html文档中的源码数据加载到etree对象中
etree.parse(filepath)
-
将互联网上获取的源码数据加载到该对象
etree.HTML("page_text")
返回的对象使用 .xpath("xpath表达式") 方法即可进行数据解析
xpath表达式
源码为 百度首页
-
/ 层级分隔定位
1. print(tree.xpath("/html/head/title")) 返回结果: # 以 / 作为层级的分隔符号 [<Element title at 0x1cdacd8a0c0>] 2. print(tree.xpath("/html//title")) 返回结果: # 以 // 作为两个层级的分隔符号 [<Element title at 0x1cdacd8a0c0>] 3. print(tree.xpath("//title")) 返回结果: # 当 // 符号作为开头使用时, 表示匹配任意位置的title [<Element title at 0x1cdacd8a0c0>] 三种方法的返回结果是一样的
-
[@属性=属性值] 属性定位
print(tree.xpath("//style[@type='text/css']")) 返回结果: [<Element style at 0x15f4656b040>, <Element style at 0x15f4656b800>, <Element style at 0x15f4656b540>,…………] 格式 [@属性名称="属性值"] 注意 属性值是由一对引号包围的
-
/p[] 索引定位
print(tree.xpath("//div[@id='s-top-left']/a[1]")) 返回结果: [<Element a at 0x2ce1c9fa080>] 属性定位之后, 通过在后方添加 /a 可以返回该标签的一个列表 这里的 a 泛指标签名称 /a 后方的 [1] 表示 /a 中的索引, 索引是从 1 开始的
-
获取文本
1. /text() print(tree.xpath("//div[@id='s-top-left']/a[1]/text()")) 返回结果: # 获取到 a 标签中第一个值的 文本 ['新闻'] ----------------------------------------------------------------- 2. /text() print(tree.xpath("//div[@id='s-top-left']/a/text()")) 返回结果: # 获取 a 标签中所有的文本 ['新闻', 'hao123', '地图', '视频', '贴吧', '学术'] ----------------------------------------------------------------- 3. 验证是否只能获得直系标签的文本 print(tree.xpath("//div[@id='s-top-left']/text()")) 返回结果: # /text() 只能获得直系标签的文本 [] "//div[@id='s-top-left']" 返回的div标签中并没有文本数据, 但是子标签中的 a 具有文本 ------------------------------------------------------------------ 4. //text() print(tree.xpath("//div[@id='s-top-left']//text()")) 返回结果: # 使用 //text() 即可获得当前标签中的所有文本数据 ['新闻', 'hao123', '地图', '视频', '贴吧', '学术', '更多', '网盘', '知 道', '百科', '图片', '宝 宝知道', '文库', '经验', '音乐', '查看全部百度产品 >']
-
获取属性
/@属性名 print(tree.xpath("//div[@id='s-top-left']//a/@href")) 返回结果: ['http://news.baidu.com', 'https://www.hao123.com', 'http://map.baidu.com', 'https://haokan.baidu.com/?…………]
-
| 定位
| 可以定位多个位置 print(tree.xpath("//div[@id='s-top-left']//a/@href | //div[@id='s-top-left']//text()")) 返回结果: ['http://news.baidu.com', '新闻', 'https://www.hao123.com', 'hao123', 'http://map.baidu.com', '地图']
上述所有的方法返回的都是一个列表