失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > 【Python爬虫】数据解析之bs4解析和xpath解析

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

时间:2023-02-11 05:36:11

相关推荐

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

🔥一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去🎶

🦋 欢迎关注🖱点赞👍收藏🌟留言🐾

🦄 本文由程序喵正在路上原创,CSDN首发!

💖 系列专栏:Python爬虫

🌠 首发时间:8月9日

✅ 如果觉得博主的文章还不错的话,希望小伙伴们三连支持一下哦

阅读指南

bs4解析1. HTML语法规则2. bs4模块安装3. 搞搞农产品价格4. 抓取彼岸图网壁纸xpath解析

bs4解析

1. HTML语法规则

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

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

<h1>数据解析</h1>

上述代码的含义是在页面中显示 “数据解析”4个字,但是 “数据解析” 这4个字被 “<h1>” 和 “</h1>” 标记了,这个时候,浏览器在展示的时候就会让里面的内容,也就是 ”数据解析“ 这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./simple bs4

3. 搞搞农产品价格

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

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

代码实现:

import csvimport requestsfrom bs4 import BeautifulSoup# 获取页面源代码url = "/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].textmax_price = tds[2].textmin_price = tds[3].textavg_price = tds[4].textunit = tds[5].textmarket = tds[6].textdate = 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. 抓取彼岸图网壁纸

彼岸图网

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

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

具体步骤一共有三步:

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

废话不多说,开搞

import requestsfrom bs4 import BeautifulSoupimport time# 1. 获取主页面源代码,然后提取子页面的链接地址url = "/"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中,

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

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

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

pip install lxml

用法:

将要解析的html内容构造出etree对象.使用etree对象的xpath()方法配合xpath表达式来完成对数据的提取

from lxml import etreexml = """<book><id>1</id><name>天才基本法</name><price>8.9</price><author><nick id="10086">林朝夕</nick><nick id="10010">裴之</nick><div><nick id="jay1">周杰伦1</nick></div><span><nick id="jay2">周杰伦2</nick></span></author><partner><nick id="ppc">佩奇</nick><nick id="ppbc">乔治</nick></partner></book>"""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="">百度</a></li><li><a href="">⾕歌</a></li><li><a href="">搜狗</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 etreetree = 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()"))

🧸 这次的分享就到这里啦,继续加油哦^^

🐱 我是程序喵,陪你一点点进步

🍭 有出错的地方欢迎在评论区指出来,共同进步,谢谢啦

如果觉得《【Python爬虫】数据解析之bs4解析和xpath解析》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。