当前位置:   article > 正文

python爬虫数据解析xpath、jsonpath,bs4_cjson xpath方式

cjson xpath方式

数据的解析

解析数据的方式大概有三种

  • xpath
  • JsonPath
  • BeautifulSoup

xpath

 安装xpath插件

打开谷歌浏览器扩展程序,打开开发者模式,拖入插件,重启浏览器,ctrl+shift+x,打开插件页面

安装lxml库 

安装在python环境中的Scripts下边,这里就是python库的位置,例如我的地址为:E:\python\python3.10.11\Scripts

pip install lxml -i https://pypi.tuna.tsinghua.edu.cn/simple

xpath使用和基本语法

解析本地文件etree.parse( 'xx.html')4.etree.HTML()

解析服务器响应文件html_tree = etree.HTML(response.read().decode( 'utf-8')4.html tree.xpath(xpath路径)

xpath基本语法:

路径查询

        // : 查找所有子孙节点,不考虑层级关系

        /  :找直接子节点

谓词查询

        //div[@id] :包含id属性的div

        //div[@id="maincontent"] :id = maincontent的div

属性查询

        //@class :   返回指定标签的class属性

模糊查询

        //div[contains(@id,"he")] 包含

        //div[starts-with(@id,"he")] :以he开头

内容查询

        //div/h1/text() : text()显示内容

逻辑运算

      //div[@id="head" and @class="s down"] : 逻辑&& 

xpath解析本地文件 

本地文件如下

  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8"/>
  5. <title>Title</title>
  6. </head>
  7. <body>
  8. <ul>
  9. <li id="00" class="beijing">北京</li>
  10. <li>上海</li>
  11. <li>深圳</li>
  12. <li>广州</li>
  13. </ul>
  14. <ul>
  15. <li id="11" class="shenyang">沈阳</li>
  16. <li>南京</li>
  17. </ul>
  18. </body>
  19. </html>

解析本地文件

  1. from lxml import etree
  2. # 解析本地文件 使用etree.parse
  3. tree = etree.parse('Test.html')
  4. # 找到所有的ul
  5. ul_list = tree.xpath("//ul")
  6. # 查找所有的li
  7. li_list = tree.xpath("//ul/li")
  8. # 查找所有包含id的li
  9. id_li_list = tree.xpath("//ul/li[@id]")
  10. # 查找id为00的li,并找到内容 注意引号问题
  11. content_list = tree.xpath("//ul/li[@id='00']/text()")
  12. # 查找id包含0的li的内容
  13. contains_list = tree.xpath("//ul/li[contains(@id,'0')]/text()")
  14. # 获取id为11的li class属性值@class
  15. li = tree.xpath("//ul/li[@id='11']/@class")
  16. print(ul_list)
  17. print(li_list)
  18. print(id_li_list)
  19. print(contains_list)
  20. print(content_list)
  21. print(li)
  22. """
  23. 输出结果:
  24. [<Element ul at 0x22c26c38240>, <Element ul at 0x22c26c38600>]
  25. [<Element li at 0x22c26c38640>, <Element li at 0x22c26c385c0>, <Element li at 0x22c26c38680>, <Element li at 0x22c26c386c0>, <Element li at 0x22c26c38700>, <Element li at 0x22c26c38780>]
  26. [<Element li at 0x22c26c38640>, <Element li at 0x22c26c38700>]
  27. ['北京']
  28. ['北京']
  29. ['shenyang']
  30. """

xpath解析服务器文件 

使用xpath插件检查xpath路径的匹配,解析定位dom

  1. from lxml import etree
  2. import urllib.request as request
  3. # 下载图片
  4. url = "https://www.baidu.com/"
  5. headers = {
  6. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/115.0.0.0 Safari/537.36',
  7. }
  8. # 构建的请求对象
  9. geneRequest=request.Request(url=url,headers = headers)
  10. # 模拟浏览器发送请求
  11. response = request.urlopen(geneRequest)
  12. # 获取内容
  13. content = response.read().decode('utf-8')
  14. # 解析服务器文件
  15. tree = etree.HTML(content)
  16. # 找到百度一下的值
  17. result = tree.xpath('//input[@id="su"]/@value')
  18. print(result)
  19. """
  20. 输出结果:['百度一下']
  21. """

jsonpath

jsonpath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,只能读取本地的json文件,与xpath类似,只不过对应符号不同

 jsonpath安装

pip install jsonpath -i https://pypi.tuna.tsinghua.edu.cn/simple

xpath和jsonpath的对应关系 

XPath    JSONPath 描述
/  根节点
. @ 现行节点
/.or[]取子节点
、、n/a取父节点,Jsonpath未支持
// 、、就是不管位置,选择所有符合条件的条件
匹配所有元素节点
@n/a 根据属性访问,Json不支持,因为Json是个Key-value递归结构,不需要
[] [] 迭代器标识(可以在里边做简单的迭代操作,如数组下标,根据内容选值等
[] ?()支持过滤操作
|[,]支持迭代器中做多选
n/a()支持表达式计算
()n/a分组,JsonPath不支持

jsonpath解析

准备json

  1. {
  2. "store": {
  3. "book":[
  4. { "category": "射手",
  5. "author": "鲁班七号",
  6. "title": "王者荣耀",
  7. "price": 8.95
  8. },
  9. {
  10. "category": "打野",
  11. "author": "李白",
  12. "title": "大河之水天上来",
  13. "price": 22.99
  14. }
  15. ],
  16. "bicycle": {
  17. "color": "red",
  18. "price": 19.95
  19. }
  20. }
  21. }

 通过jsonpath解析json数据

  1. import json
  2. import jsonpath
  3. obj = json.load(open('test.json',"r",encoding="utf-8"))
  4. # 查看store下的bicycle的color属性 $ 对应xpath/
  5. colorAttr = jsonpath.jsonpath(obj, "$.store.bicycle.color")
  6. # 输出book节点的第一个对象
  7. bookFirst = jsonpath.jsonpath(obj, "$.store.book[0]")
  8. # 输出book节点中所有对象对应的属性title值
  9. titles = jsonpath.jsonpath(obj, "$.store.book[*].title")
  10. # 输出book节点中所有价格小于10的对象 ?() 对应xpath [] @ 对应当前节点
  11. books = jsonpath.jsonpath(obj, "$.store.book[?(@.price<10)]")
  12. print(colorAttr)
  13. print(bookFirst)
  14. print(titles)
  15. print(books)
  16. """
  17. 输出结果:
  18. ['red']
  19. [{'category': '射手', 'author': '鲁班七号', 'title': '王者荣耀', 'price': 8.95}]
  20. ['王者荣耀', '大河之水天上来']
  21. [{'category': '射手', 'author': '鲁班七号', 'title': '王者荣耀', 'price': 8.95}]
  22. """

BeautifulSoup

Beautifulsoup简称bs4,Beautifulsoup,和lxml一样,是一个html的解析器,主要功能也是解析和提取数据

  • 缺点: 效率没有1xm1的效率高
  • 优点: 接口设计人性化,使用方便

BeautifulSoup安装

pip install bs4  - i  https://pypi.tuna.tsinghua.edu.cn/simple

 BeautifulSoup节点定位规则

soup = soup = Beautifulsoup(response.read().decode(),'Ixml') 解析服务器文件

soup = soup = Beautifulsoup(open('1.html').lxml')  解析本地文件

根据标签名查找节点
        soup.a  只能找到第一个a
        soup.a.namesoup.a.attrs   获取标签的属性和属性值

函数查找

  .find (返回一个对象 只能找到第一个a标签)

        find('a')

        find('a',title='名字')

        find('a',class='名字')

  .find_all (返回一个列表 )

        find all('a') 

        find all(['a’,'span']) 返回所有的a和span

  .select(根据选择器得到节点对象)[推荐]

        element

                eg: div

        class

                eg:.firstname

        id

                eg:#firstname

        属性选择器

                eg:li = soup.select('li[class]')

                eg:li = soup.select('li[class="hengheng"]')

        层级选择器

                element element

                          div p

                                eg:soup = soup.select('a span')

                element>element

                          div>p

                                eg:soup = soup.select('a>span')

                element,element

                          div,p

                                eg:soup = soup.select('a,span')

BeautifulSoup节点信息

获取节点内容

        obj.string

        obj.get_text()[推荐] 

获取节点的属性

        eg:tag = find('li)

                tag.name 获取标签名

                tag.attrs将属性值作为一个字典返回

获取节点属性

        obj.attrs.get('title')[常用]

        obj.get('title')

        obj['title']

BeautifulSoup解析文件

以上述xpath中的本地文件Test.html为例,上边已经写过,这里直接上代码

  1. from bs4 import BeautifulSoup
  2. soup = BeautifulSoup(open('Test.html',encoding='utf-8'),'lxml')
  3. # 查找第一个ul
  4. print(soup.find("ul"))
  5. # 查找所有的ul
  6. print(soup.find_all("ul"))
  7. # 选择查找 li class为beijing的标签
  8. print(soup.select("li[class =beijing]"))
  9. #层级选择查找ul下的class为beijing的li节点
  10. nodeli=soup.select("ul li[class = beijing]")[0]
  11. # 获取li节点内容
  12. print(nodeli.get_text())
  13. # 获取li标签名
  14. print(nodeli.name)
  15. #获取li的属性
  16. print(nodeli.attrs)
  17. # 获取li的id属性
  18. print(nodeli.attrs.get('id'))
  19. """
  20. 输出结果:
  21. <ul>
  22. <li class="beijing" id="00">北京</li>
  23. <li>上海</li>
  24. <li>深圳</li>
  25. <li>广州</li>
  26. </ul>
  27. [<ul>
  28. <li class="beijing" id="00">北京</li>
  29. <li>上海</li>
  30. <li>深圳</li>
  31. <li>广州</li>
  32. </ul>, <ul>
  33. <li class="shenyang" id="11">沈阳</li>
  34. <li>南京</li>
  35. </ul>]
  36. [<li class="beijing" id="00">北京</li>]
  37. 北京
  38. li
  39. {'id': '00', 'class': ['beijing']}
  40. 00
  41. """
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/菜鸟追梦旅行/article/detail/109117?site
推荐阅读
相关标签
  

闽ICP备14008679号