Python爬虫基础——XPath表达式

打印 上一主题 下一主题

主题 1801|帖子 1801|积分 5403

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
        起首说一下这节内容在学习过程中存在的问题吧,在爬取百度网页笔墨时,出现了问题,就是通过表达式在网页搜刮中可以定位,但是通过代码无法定位,讨教了一位老师,他说是动态链接,目前这部分内容比力陌生,还没有学习到,因此过一段时间在举行补充验证。我一般在学习时都是通过复现作者所写的代码,然后在举行扩展,最后结合网上的思路编写一个想读复杂的案例。
1、实例化etree对象
1.1 etree.parse('HTML文档路径') 使用patse()函数对etree举行实例化(已经验证)
1.2 etree.HTML('网页源码') 使用patse()函数对etree举行实例化(已经验证)
2、用XPath表达式定位标签并提取数据(动态参数存在问题,爬取静态类没有问题)参考文中代码
2.1 定位标签 2.1.1 标署名定位
2.1.2 索引定位
2.1.3 属性定位
2.1.4 逻辑也能算定位
2.2 提取文本内容和属性值
3、快速获取标签节点的Xpath表达式(已经验证)
  1. ##############################
  2. ##作者:白雪公主的后妈
  3. ##时间:2024年1月6日
  4. ##主题:Python爬虫基础——Xpath表达式
  5. ##主要内容:学习BeaytifulSoup对象中的lxml模块中的etree类,即etree类可以将网页源码实例化为一个etree对象,并shiyongXpanth表达式进行标签定位
  6. ##############################
  7. #1、实例化etree对象
  8. #要使用Xpanth表达式进行数据解析,首先需要实例化一个etree对象,具体方法有两种
  9. #1.1    etree.parse('HTML文档路径')     使用patse()函数对etree进行实例化
  10. # from lxml import etree
  11. # html = etree.parse('text1.html')        #将HTML文档加载到etree类中,实例化成为一个名为html的etree对象
  12. # #1.2    etree.HTML('网页源码')     使用patse()函数对etree进行实例化
  13. # from lxml import etree
  14. # import requests
  15. # #身份码伪装
  16. # header = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36 Edg/131.0.0.0"}        #浏览器身份验证
  17. # #请求的地址
  18. # url = "https://www.baidu.com"
  19. # #发起请求,并获得网页源代码
  20. # response = requests.get(url,headers=header).text
  21. # html = etree.HTML(response)        #将网页源码加载到etree类中,实例化成为一个名为html的etree对象
  22. #2、用XPath表达式定位标签并提取数据
  23. #完成etree对象实例化后,可以使用XPath表达式定位标签并提取数据了
  24. #2.1 定位标签
  25. #2.1.1 标签名定位
  26. '''
  27. 假设要定位<ul>标签下的所有<li>标签节点,在途中从上往下依次是<html>标签节点——><div>标签节点2——>
  28. <ul>标签节点2——><li>标签节点1、<li>标签节点2。注意用“/”表示一个层次,用“//”表示多个层次,因此,
  29. 上述路径XPath可以表示为“/html/body/div[1]/ul/il”。如果不加分区的定义所有的<li>标签,也可以用"//"。
  30. '''
  31. #2.1.2 索引定位
  32. '''
  33. etree对象的每一个层阶都是一个包含所有标签节点的列表,如果同一层级中有多个同名的标签节点,
  34. 使用列表切片就能定位到所需的标签节点,即通过索引定位。
  35. '''
  36. #2.1.3 属性定位
  37. '''
  38. 在复杂的网页中,每个标签都有其属性,此时可以通过属性进行定位。
  39. '''
  40. import requests
  41. from lxml import etree
  42. #身份码伪装
  43. header = {"User-Agent":"Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/131.0.0.0 Mobile Safari/537.36 Edg/131.0.0.0"}        #浏览器身份验证
  44. #请求的地址
  45. #url = "https://www.baidu.com"
  46. url = "https://www.hongxiu.com/chapter/30300190804146407/81349808731782632"
  47. #发起请求,并获得网页源代码
  48. response = requests.get(url,headers=header).text
  49. # print(response)
  50. html=etree.HTML(response)     #实例化etree对象
  51. # print(html)
  52. print(html.xpath('//*[@id="chapter-81349808731782632"]/div/div[2]/div/p'))
  53. #(html.xpath('//*[@id="hotsearch-content-wrapper"]/text()'))            #?????百度这里是动态链接书上给给到的这个方法有问题
  54. # print(html.xpath('//*[@class="title"'))             #用class属性定位标签
  55. '''
  56. "//"表示多层级,处于Xpath表达式的开头代表从任意层级开始定位;“*”代表任意标签;"[@class="title"代表class属性值为"title"
  57. 的任意标签。如果拥有同一个class属性的标签不止一个,可以考虑用id属性值来定位。如果还不能达到目的,可以用其他属性来定位,也
  58. 可以将上述XPath表达式中的“*”替换为指定的标签名称,如html.xpath('//p[@class="title"')
  59. '''
  60. #2.1.4 逻辑也能算定位
  61. '''
  62. 使用上述方法仍然不能定位,可以配合逻辑运算来进行更精确的定位。
  63. '''
  64. # html.xpath('//p[@class="title" and @name="color"]')
  65. # html.xpath('//p[@class="title" or @name="color"]')
  66. #2.2 提取文本内容和属性值
  67. '''
  68. 定位到标签节点后,可在Xpath表达中后面添加“/text”来提取该节点下的所有文本内容,添加“text()”来提取该节点的所有文本内容,
  69. 添加“/@属性名”来提取该节点的指定属性值
  70. '''
  71. # html.xpath('//*[@class="title"]/text()')
  72. # html.xpath('//*[@class="title"]//text()')
  73. # html.xpath('//*[@class="title"]/@id')
  74. #3、快速获取标签节点的Xpath表达式
  75. '''
  76. 在谷歌浏览器中打开一个网页,然后打开开发者工具,在“Elements”选项卡中的网页源码中邮寄要获取的表达式的标签,
  77. 选择copy——>copy xpath即可赋值XPath表达式粘贴到爬虫程序中
  78. '''
复制代码


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

西河刘卡车医

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表