网页解析_xpath-02
第一部分:简介
1 | 原理跟soup一样,都是把html字符串转换成标签对象,像选择路径一样选择标签。 |
第二部分:代码块
1:公共代码部分
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 | from lxml import etree # 导包 <html> <head> <title>爬虫< / title> <meta charset = "utf-8" > <link rel = "stylesheet" href = "http://www.taobao.com" > <link rel = "stylesheet" href = "https://www.baidu.com" > <link rel = "stylesheet" href = "http://at.alicdn.com/t/font_684044_un7umbuwwfp.css" > < / head> <body> <! - - footer start - - > <footer id = "footer" > <div class = "footer-box" > <div class = "footer-content" > <p class = "top-content" id = "111" > <a href = "http://www.taobao.com" >淘宝< / a> <span class = "link" > <a class = "product" href = "https://www.baidu.com" >关于Python< / a> <a href = "http://www.taobao.com" >好好学习< / a> <a href = "javascript:void(0)" >人生苦短< / a> <a href = "javascript:void(0)" >我用Python< / a> < / span> <span class = "about-me" >关于我: <i class = "PyWhich py-wechat" >< / i> 忽略< / span> < / p> <p class = "bottom-content" > # <a href="https://www.xiaoxa" id=25>xiaogan</a> <span>地址: xxxx< / span> <span>联系方式: <a href = "tel:400-1567-315" > 400 - 1567 - 315 < / a> ( 24 小时在线)< / span> < / p> < / div> <p class = "copyright-desc" > Copyright © 爬虫有限公司. All Rights Reserved < / p> < / div> < / footer> < / body> < / html> """ |
2:主要代码块
page=etree.HTML(html_str) #
print(page) # <Element html at 0x183fc16dc08>
print(type(page)) # <class 'lxml.etree._Element'>
print(page.xpath('/html')) # [<Element html at 0x18bfcd43c08>] 从跟节点选择
print(page.xpath('/p')) # []
# 1.标签与属性的选择
print(page.xpath('/html/body/footer')) # /:一级级选择 [<Element footer at 0x2835b023b48>]
print(page.xpath('/html/body/p')) # /:从路径开始,一级级选择 [] p不是下一级
print(page.xpath('//p')) # 获取所有p标签,不限位置
# [<Element p at 0x1db29126b88>, <Element p at 0x1db29126bc8>, <Element p at 0x1db29126c88>]
print(page.xpath('//p')[0]) # 获取所有p标签,不限位置
# <Element p at 0x1e491e46b88>
p=page.xpath('//p')[0]
print(p.xpath('./a')) # .当前标签 获取第一个a [<Element a at 0x24a055f6c88>]
print(p.xpath('.//a')) # .当前标签 //获取所有a
# [<Element a at 0x20f760d6c88>, <Element a at 0x20f760d6bc8>,
# <Element a at 0x20f760d6cc8>, <Element a at 0x20f760d6d08>, <Element a at 0x20f760d6d48>]
print(p.xpath('.//a')) # .当前标签 //获取所有a <Element a at 0x2b7d07f6d88>
print(p.xpath('./span')) # .当前标签 //获取所有 [<Element span at 0x2b7d07f6d88>, <Element span at 0x2b7d07f6c88>]
print(p.xpath('.//a')[0]) # .当前标签 //获取所有a <Element a at 0x1b23d0a6d48>
a=p.xpath('.//a')[0]
print(a.xpath('..')) # 选取当前节点的父节点 为p [<Element p at 0x256d18c6b88>]
# nodename 选取当前节点的所有nodename子节点
print(page.xpath('body')) # [<Element body at 0x263305c6cc8>]
#
print(p.xpath('a')) # [<Element a at 0x2cae1256d48>]
print('======================================================')
# 2.
p=page.xpath('//p') # 如果要选择指定的p怎么办?根据属性
print(p)
# [<Element p at 0x20f22746b88>, <Element p at 0x20f22746cc8>, <Element p at 0x20f22746d88>]
# < p
# class ="top-content" id="111" >
print(page.xpath('//p[@class="top-content"]')) # [<Element p at 0x1c006aa6b88>]
print(page.xpath('//p[@class="top-content"]/@id')) # 很常用 ['111']
print(page.xpath('//p/*')) # 选取p元素的所有子元素 * 匹配任何元素节点
print(page.xpath('//p/@*')) # @* 匹配任何属性节点 @*:所有p标签下的属性
# 获取所有的属性: ['top-content', '111', 'bottom-content', 'copyright-desc']
# print(page.xpath('//*')) # 获取所有元素
#
print(page.xpath('//p[@class="top-content"]/a')) # 跟下面相同的 列表是从0开始
# [<Element a at 0x23d90566d48>]
print(page.xpath('//p[@class="top-content"]/a')[0]) # <Element a at 0x1ab226e7d48>
print(page.xpath('//p[@class="top-content"]/a[1]')) # 相同的 如果在xpath里进行索引选择 是从1开始
# [<Element a at 0x1ab226e7d48>]
print('===================================================')
print(page.xpath('//p[@class="top-content"]/a[last()]')) # 待? [<Element a at 0x1d2d49a6d48>]
# 3.获取文本
# 用text()获取某个节点下的文本
# 如果在源码增加<a href="https://www.xiaoxa" id=25>xiaogan</a>
contents=page.xpath('//p//a/text()') # 获取/所有p下的所有a元素 拿到的是列表
print(contents) # ['淘宝', '关于Python', '好好学习', '人生苦短', '我用Python', '400-1567-315']
# 用string()获取某个节点下所有的文本
contents1=page.xpath('string(//p)') # 拿到一个p的内容
print(contents1)
print(page.xpath('string(//body)')) # 如果想拿更多内容把范围选大一些
# print(page.xpath('string(//html)')) # 这种方式拿数据不好
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 单元测试从入门到精通
· 上周热点回顾(3.3-3.9)
· Vue3状态管理终极指南:Pinia保姆级教程