当前位置:   article > 正文

Python--爬虫--XPath入门_python——xpath基础

python——xpath基础

目录

一、XPath简介

二、xpath函数

三、步骤

四、结果


一、XPath简介

全称:XML Path Language;

作用:  解析数据(HTML,XML),提取节点与节点包含的内容;

什么是节点?

HTML为例:<body>是一个根节点,<div>,<a>等是根节点的子节点,<div>,<a>等节点包含的节点是他们的子节点,实例如下。

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <title>xpath_test</title>
  6. </head>
  7. <body>
  8. <div>这里是根节点body的子节点div<div/>
  9. <p>这里是div的子节点p<p/>
  10. <a>这里是根节点body的子节点a<a/>
  11. <p>这里是div的子节点p<p/>
  12. </body>
  13. </html>

二、xpath函数

2.1、XPath常用函数:

xlm/html对象.etree()函数

使用方法:

2.1.1、etree = tree.xpath("/父节点1/子结点2")->返回的是子节点,返回内容如下:

<Element 子节点2 at 地址>

2.1.2、etree = tree.xpath("/父节点1/子结点2/text()")->返回的是子节点2的文本内容

2.1.3、etree = tree.xpath("/父结点1//子结点2")->返回的是子节点2的全部后代节点

2.1.4、etree = tree.xpath("/父结点1/子结点2/@子节点2的属性值")->返回的是子节点2的的属性值

2.1.5、etree = tree.xpath("./节点/节点")->相对查找,一般在缩小范围准备提取内容时在循环遍历使用。

x = html.xpath()函数

*:表示任意节点

节点[第几个],1开始

./:相对查找

//:绝对查找

/@属性:拿属性的值

/text():拿标签的文本内容

父节点//子节点->显示全部 //->后代

三、步骤

3.1、运行环境:win10家庭版,phcharm edu;

3.2、下载所用的库(提供两种方法):在编辑器(如pycharm)控制台输入:pip install lxml,pip install requests,也可以在编辑器的设置里,Python Interpreter直接搜索包并下载;

3.3、操作步骤

3.3.1、目标实例

        天堂电影;

3.3.2、需求

        抓取2022新片推荐下载链接(可下载);

3.4、源码

  1. # 天堂电影
  2. # 2022新片
  3. from lxml import html
  4. import requests
  5. # 发起请求拿源码,发现是get方式传参
  6. url = "https://www.dy2018.com/"
  7. resp = requests.get(url)
  8. resp.encoding = 'gb2312'
  9. resp_content = resp.text
  10. # print(resp_content),测试是否成功拿到源码
  11. # 创建html的etree解析,并把html源码交给etree解析
  12. etree = html.etree
  13. html = etree.HTML(resp_content)
  14. # 开始定位
  15. lis = html.xpath('//*[@id="header"]/div/div[3]/div[4]/div[1]/div[2]/ul/li')
  16. # 循环遍历取出
  17. for li in lis:
  18. hrefs = li.xpath("./a/@href")
  19. # print(hrefs)
  20. all_href = ''.join(hrefs) # 把列表中的元素放在空串中,元素间用空格隔开
  21. all_hrefs = url + all_href # 把链接拼接起来
  22. if all_href == "https://www.jianpian12.com/": # 出现一个没用的干扰链接,去掉
  23. all_href = ""
  24. else:
  25. titles = li.xpath("./a/text()")
  26. all_titles = ''.join(titles) # 把列表中的元素放在空串中,元素间用空格隔开
  27. # print(all_titles, end=" ") 拿到电影名称
  28. # print(all_hrefs) 拿到电影跳转具体下载链接
  29. # 第二次请求
  30. resp2 = requests.get(all_hrefs)
  31. resp2.encoding = 'gb2312' # 查看源码,得到编码方式,进行解析
  32. resp_content2 = resp2.text
  33. # print(resp_content),测试是否成功拿到源码
  34. # 创建html的etree解析,并把html源码交给etree解析
  35. # etree = html.etree
  36. html2 = etree.HTML(resp_content2)
  37. # 开始定位
  38. # ”//*[@id="Zoom"]/div[1]/ul/li/a“
  39. # "//*[@id="Zoom"]/div[1]/ul/li/a" 发现每一个的id都一样直接copy,xpath路径进行使用
  40. lis2 = html2.xpath('//*[@id="Zoom"]/div[1]/ul/li')
  41. for lis in lis2:
  42. all_href2 = lis.xpath("./a/@href")
  43. all_hrefs2 = ''.join(all_href2) # 把列表中的元素放在空串中,元素间用空格隔开
  44. all_hrefs2 = all_hrefs2.split("=")[-1]
  45. # all_hrefs2 = all_hrefs2.split("/")
  46. print(all_hrefs2)
  47. # 下一步应该是拿到了下载链接的地址进行下载并保存
  48. # 但发现链接访问失败(在浏览器访问下载链接也是失败的,很奇怪),先进行到这步,之后在探究是什么问题之后继续补充

四、结果

4.1、返回的结果

 

五、问题与总结

5.1、问题

5.1.1、爬取到的链接访问不到内容(是否是存在防盗链呢?);

5.1.2、爬取并输出的内容分割性不好,代码需要优化;

5.2、总结

5.2.1、好好学习。

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/正经夜光杯/article/detail/820848
推荐阅读
相关标签
  

闽ICP备14008679号