【Python爬虫】数据解析之bs4解析和xpath解析

【Python爬虫】数据解析之bs4解析和xpath解析bs4 解析比较简单 但是呢 我们需要了解一些基础的前端知识 然后再使用 bs4 去提取 逻辑就会清晰很多 编写难度也会大大降低 HTML HyperTextMar 超文本标记语言 是我们编写网页的最基本同时也是最核心的一种语言 其语法规则就是用不同的标签对网页上的内容进行标记 从而使网页显示出不同的展示效果

?一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去?
? 欢迎关注?点赞?收藏?留言?
? 本文由 程序喵正在路上 原创,CSDN首发!
? 系列专栏:Python爬虫
? 首发时间:2022年8月9日
✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦










bs4解析

1. HTML语法规则

bs4 解析比较简单,但是呢,我们需要了解一些基础的前端知识,然后再使用 bs4 去提取,逻辑就会清晰很多,编写难度也会大大降低

HTMLHyper Text Markup Language)超文本标记语言,是我们编写网页的最基本同时也是最核心的一种语言,其语法规则就是用不同的标签对网页上的内容进行标记,从而使网页显示出不同的展示效果

<h1>数据解析 
     h1> 

上述代码的含义是在页面中显示 “数据解析” 4 个字,但是 “数据解析” 这 4 个字被 “

” 和 “
” 标记了,这个时候,浏览器在展示的时候就会让里面的内容,也就是 ”数据解析“ 这
4 个字变大加粗,俗称标题,所以
HTML 的语法就是用类似这样的标签对页面内容进行标记,不同的标签表示出来的效果也是不一样的

h1:一级标题 h2:二级标题 p:段落 font:字体 body:主体 

这里只是给小白们简单科普一下,HTML 的标签远不止这些

好的,标签我们明白了,接下来就是属性了

<h1>数据解析 
     h1> <h1 align='right'>数据解析 
      h1> 

我们还可以在标签中添加 ” align='right' ” 这样的东西,这又是什么呢?

首先,这两个标签都是 h1 标签,都是一级标题,但是下面这个会显示在右边,也就是说,通过这种形式对 h1 标签添加了说明,这种语法在 HTML 中被称为标签的属性,并且属性可以有很多个

总结:HTML 语法:

<标签 属性="" 属性=""> 被标记的内容  
     标签> 

有了这些知识,我们再去看 bs4 就会得心应手了,因为 bs4 就是通过标签和属性去定位页面上的内容的

2. bs4模块安装

bs4 是一个第三方库,首先我们得进行安装

Python 中推荐使用 pip 进行安装,很简单,在 Pycharm 下方找到 Terminal,输入以下命令:

pip install bs4 

如果安装过慢,可以考虑更换为国内源:

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

3. 搞搞农产品价格

bs4 在使用的时候需要参照一些 HTML 的基本语法来进行使用,通过案例来学会使用 bs4 更加快捷

我们来尝试抓取北京岳各庄批发市场的农产品价格 ➔ 目标网站

在这里插入图片描述

在这里插入图片描述

代码实现:

import csv import requests from bs4 import BeautifulSoup # 获取页面源代码 url = "http://www.ygzapm.com/web/dailyPrice" resp = requests.get(url) # print(resp.text) # 测试用 f = open("农产品信息.csv", mode="w", encoding='utf-8', newline='') csvWriter = csv.writer(f) # 解析数据 # 1. 把页面源代码交给 BeautifulSoup 进行处理,生成 bs 对象 page = BeautifulSoup(resp.text, "html.parser") # 指定html解析器 # 2. 从bs对象中查找数据,两个函数 # find(标签, 属性=值) 找一个 # find_all(标签, 属性=值) 找全部 # table = page.find("table", class_="table") # 加下划线区分关键字,与下面的表达式一样 table = page.find("table", attrs={ 
   "class": "table"}) # print(table) # 测试用 trs = table.find_all("tr")[1:] for tr in trs: # 遍历表格的每一行 tds = tr.find_all("td") type = tds[0].text # 拿到被标签标记的内容 name = tds[1].text max_price = tds[2].text min_price = tds[3].text avg_price = tds[4].text unit = tds[5].text market = tds[6].text date = tds[7].text # print(type, name, max_price, min_price, avg_price, unit, market, date) # 测试用 csvWriter.writerow([type, name, max_price, min_price, avg_price, unit, market, date]) resp.close() f.close() print("over!!!") 

效果:

在这里插入图片描述

你也可以对代码进行改进,抓取多页数据,但个人建议不要将全部数据都抓取下来

4. 抓取彼岸图网壁纸

彼岸图网

在这里插入图片描述

你以为我们要抓取的是这些图片吗?

其实不是,我们要抓取的是点击图片进入的页面的高清图片,也就是如下

在这里插入图片描述

具体步骤一共有三步:

  1. 获取主页面源代码,然后提取子页面的链接地址
  2. 获取子页面源代码,查找图片的下载地址
  3. 下载图片

废话不多说,开搞

import requests from bs4 import BeautifulSoup import time # 1. 获取主页面源代码,然后提取子页面的链接地址 url = "https://pic.netbian.com/" resp = requests.get(url) resp.encoding = 'gbk' main_page = BeautifulSoup(resp.text, "html.parser") alist = main_page.find("div", class_="slist").find_all("a") # print(alist) # 测试用 for a in alist: href = url + a.get('href') # 通过get得到属性的值,拼接得到完整子页面链接 # print(a) # 测试用 # 2. 获取子页面源代码,查找图片的下载地址 sub_page_resp = requests.get(href) sub_page_resp.encoding = 'gbk' sub_page_text = sub_page_resp.text # 从子页面中获取图片的下载地址 sub_page = BeautifulSoup(sub_page_text, "html.parser") div = sub_page.find("div", class_="photo-pic") img = div.find("img") img_href = url + img.get("src").strip("/") # 拼接图片的下载地址 # print(img_href) # 测试用 # 3. 下载图片 img_resp = requests.get(img_href) img_name = img_href.split("/")[-1] # 图片名称 img_package = "D:\\pythonProject\\images\\" # 先自己创建一个文件夹以便存放图片,再运行程序 with open(img_package + img_name, mode='wb') as f: f.write(img_resp.content) # 这里拿到的是字节 img_resp.close() sub_page_resp.close() print(img_name + " 已下载成功") time.sleep(1) # 让服务器休息一下 resp.close() print("over!!!") 

这里是因为我的编译器设置了背景,图片效果不是特别好,还行

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

xpath解析

xpath 是一门在 XML 文档中查找信息的语言,xpath 可用来在 XML 文档中对元素和属性进行遍历,而我们熟知的 HTML 恰巧属于 XML 的一个子集,所以完全可以用 xpath 去查找 html 中的内容

首先,我们先了解几个概念

<book> <id>1 
     id> <name>天才基本法 
      name> <price>8.9 
       price> <author> <nick>林朝夕 
        nick> <nick>裴之 
         nick>  
          author>  
           book> 

在上述 html 中,

  1. book, id, name, price…都被称为节点.
  2. Id, name, price, author 被称为 book 的子节点
  3. book 被称为 id, name, price, author 的父节点
  4. id, name, price,author 被称为同胞节点

好的,有了这些基础知识后,我们就可以开始了解 xpath 的基本语法了

Python 中想要使用 xpath,需要安装 lxml 模块

pip install lxml 

用法:

  1. 将要解析的 html 内容构造出 etree 对象.
  2. 使用 etree 对象的 xpath() 方法配合 xpath 表达式来完成对数据的提取
from lxml import etree xml = """ 
    
    
      1 
     
    
      天才基本法 
     
    
      8.9 
     
     
     
       林朝夕 
      
     
       裴之 
      
     
周杰伦1
周杰伦2
佩奇 乔治
"""
tree = etree.XML(xml) # result = tree.xpath("/book") # / 表示层级关系,第一个 / 是根节点 # result = tree.xpath("/book/name/text()") # text() 获取文本 # result = tree.xpath("/book/author/nick/text()") # result = tree.xpath("/book/author//nick/text()") # 获取author里面所有nick里面的内容 # result = tree.xpath("/book/author/*/nick/text()") # * 任意的节点,通配符 result = tree.xpath("/book//nick/text()") # 获取所有nick里面的内容 print(result)

准备一个 HTML 文件:

 
    DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <title>Title 
      title>  
       head> <body> <ul> <li><a href="http://www.baidu.com">百度 
        a> 
         li> <li><a href="http://www.google.com">⾕歌 
          a> 
           li> <li><a href="http://www.sogou.com">搜狗 
            a> 
             li>  
              ul> <ol> <li><a href="plane">⻜机 
               a> 
                li> <li><a href="cannon">⼤炮 
                 a> 
                  li> <li><a href="train">⽕⻋ 
                   a> 
                    li>  
                     ol> <div class="jay">周杰伦 
                      div> <div class="food">麻辣烫 
                       div>  
                        body>  
                         html> 

xpath 最方便的地方在于它可以直接复制,都不用你写

浏览器右击选择检查,点左上角小箭头点击你要提取的内容,它会自动匹配对应的 HTML 代码,右击 HTML 代码,选择复制,选择 xpath

在这里插入图片描述

from lxml import etree tree = etree.parse("data.html") # result = tree.xpath('/html/body/ul/li[1]/a/text()') #xpath的顺序是从1开始数的 # result = tree.xpath("/html/body/ol/li/a[@href='cannon']/text()") # 属性筛选 # print(result) # ol_li_list = tree.xpath("/html/body/ol/li") # for li in ol_li_list: # print(li.xpath("./a/text()")) # 在li中继续查找,相对查找 # print(li.xpath("./a/@href")) # 获取属性值 # # print(tree.xpath("/html/body/ul/li/a/@href")) print(tree.xpath("/html/body/div[1]/text()")) 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/201162.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月20日 上午9:56
下一篇 2026年3月20日 上午9:57


相关推荐

  • 紫光同创国产FPGA学习之器件情况

    紫光同创国产FPGA学习之器件情况国产的 FPGA 目前比较少 年轻没有办法的 所以 器件也没什么好选的 两个系列 titan 和 logos 好像 titan 系列的芯片 一般情况买不到 估摸着没点量 人家不卖给你 好吧 只能选 logos 系列了 TBD 是待决定的意思 12G 35H 50H 待决定 那就只有 22G 唯一的一种了 只有 2 个封装 186 240 管脚 好像比 xc6slx25 小了那么一点点 差不多一样的资源量吧

    2026年3月26日
    1
  • Disruptor入门

    Disruptor入门Disruptor 入门翻译自 Disruptorgit 库教程 nbsp nbsp 英文地址获得 Disruptor 可以通过 Maven 或者下载 jar 来安装 Disruptor 只要把对应的 jar 放在 Javaclasspat 就可以了 基本的事件生产和消费我们从一个简单的例子开始学习 Disruptor 生产者传递一个 long 类型的值给消费者 而消费者消费这个数据的方式仅仅是把它打

    2026年3月18日
    3
  • shell中的if判断语句怎么写_shell脚本中if用法

    shell中的if判断语句怎么写_shell脚本中if用法if条件判断与if真假判断目录:1.正确写法2.错误写法3.总结一、正确写法在编写shell脚本时,为简化代码的行号及结构的简约型,通常将命令执行结果和判断通过一条语句进行编写(在C语言编写程序时,经常遇到此种写法),如:方法1:单一命令条件判断[root@centos7~]#touchtest.shifuseraddroot&am…

    2022年8月18日
    9
  • 查看g++/gcc版本

    查看g++/gcc版本windows查看gcc/g++版本cmd命令行gcc–versiong++–version

    2022年6月26日
    186
  • Arduino 和LCD1602液晶屏 I2C接口实验「建议收藏」

    LCD1602液晶屏带I2C接口为什么使用I2C接口?因为省IO口啊,只需要4条线,可以看看之前发的实验,接线多复杂呀,对吧。(传送门:Arduino携手LCD1602向世界问好“helloWorld!”)还有背光灯,和可调节对比度(就是背面蓝色那块可以旋转的调)具体怎么实现解决问题,请往下看引脚说明GND——地线VC…

    2022年4月14日
    263
  • 这个周末全网“养龙虾”!OpenClaw加持,拓维信息真正利好是这个

    这个周末全网“养龙虾”!OpenClaw加持,拓维信息真正利好是这个

    2026年3月13日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号