re、bs4、xpath数据解析
re正则#
介绍#
RegularExpression,正则表达式,一种使用表达式的方式对字符串进行匹配的语法规则,
我们抓取到的网页源代码本质上就是一个超长的字符串,想从里面提取内容,用正则再合适不过了,
正则的优点:速度快,效率高,准确性高
正则的缺点:新手上手难度有点儿高
使用#
四种常用匹配方式
import re
# findall:匹配所有,返回list
lst = re.findall(r"\d+", "我的电话号是:10086,我女朋友的电话是:10010")
print(lst) # ['10086', '10010']
# finditer:匹配所有,返回迭代器
it = re.finditer(r"\d+", "我的电话号是:10086,我女朋友的电话是:10010")
for i in it:
# i是re.Match对象,取值要用.group
print(i.group())
# search:匹配到第一个后结束
# 返回的是re.Match对象,取值要用.group
s = re.search(r"\d+", "我的电话号是:10086,我女朋友的电话是:10010")
print(s.group())
# match:从头开始匹配,相当于加了个^
# 返回re.Match对象
# s = re.match(r"\d+", "我的电话号是:10086,我女朋友的电话是:10010") # 没匹配到,因为不是数字开头
s = re.match(r"\d+", "10086,我女朋友的电话是:10010") # 匹配到了
print(s.group())
预加载正则表达式
# 优点:匹配复用,使代码更清晰
obj = re.compile(r"\d+")
ret = obj.finditer("10086,我女朋友的电话是:10010")
for i in ret:
print(i.group())
取正则中的内容
# 给正则命名:(?P<分组名字>正则)
# flags参数:扩展正则
s = """
<div class='jay'><span id='1'>郭麒麟</span></div>
<div class='jj'><span id='2'>宋铁</span></div>
<div class='jolin'><span id='3'>大聪明</span></div>
<div class='sylar'><span id='4'>范思哲</span></div>
<div class='tory'><span id='5'>胡说八道</span></div>
"""
obj = re.compile(r"<div class='.*?'><span id='\d+'>(?P<wahaha>.*?)</span></div>", flags=re.S) # re.S使.可以匹配换行符
result = obj.finditer(s)
for i in result:
# print(i.group())
print(i.group("wahaha"))
实战#
手刃豆瓣top250电影排行
# 拿到页面源代码. requests
# 通过re来提取想要的有效信息 re
import requests
import re
import csv
url = "https://movie.douban.com/top250"
headers = {
"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_4) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.192 Safari/537.36"
}
resp = requests.get(url, headers=headers)
page_content = resp.text
# 解析数据
obj = re.compile(r'<li>.*?<div class="item">.*?<span class="title">(?P<name>.*?)'
r'</span>.*?<p class="">.*?<br>(?P<year>.*?) .*?<span '
r'class="rating_num" property="v:average">(?P<score>.*?)</span>.*?'
r'<span>(?P<num>.*?)人评价</span>', re.S)
# 开始匹配
result = obj.finditer(page_content)
f = open("data.csv", mode="w")
csvwriter = csv.writer(f)
for it in result:
# print(it.group("name"))
# print(it.group("score"))
# print(it.group("num"))
# print(it.group("year").strip())
dic = it.groupdict()
dic['year'] = dic['year'].strip()
csvwriter.writerow(dic.values())
f.close()
print("over!")
屠戮盗版天堂电影信息
# 1. 定位到2020必看片
# 2. 从2020必看片中提取到子页面的链接地址
# 3. 请求子页面的链接地址. 拿到我们想要的下载地址....
import requests
import re
domain = "https://www.dytt89.com/"
resp = requests.get(domain, verify=False) # verify=False 去掉安全验证
resp.encoding = 'gb2312' # 指定字符集
# print(resp.text)
# 拿到ul里面的li
obj1 = re.compile(r"2020必看热片.*?<ul>(?P<ul>.*?)</ul>", re.S)
obj2 = re.compile(r"<a href='(?P<href>.*?)'", re.S)
obj3 = re.compile(r'◎片 名(?P<movie>.*?)<br />.*?<td '
r'style="WORD-WRAP: break-word" bgcolor="#fdfddf"><a href="(?P<download>.*?)">', re.S)
result1 = obj1.finditer(resp.text)
child_href_list = []
for it in result1:
ul = it.group('ul')
# 提取子页面链接:
result2 = obj2.finditer(ul)
for itt in result2:
# 拼接子页面的url地址: 域名 + 子页面地址
child_href = domain + itt.group('href').strip("/")
child_href_list.append(child_href) # 把子页面链接保存起来
# 提取子页面内容
for href in child_href_list:
child_resp = requests.get(href, verify=False)
child_resp.encoding = 'gb2312'
result3 = obj3.search(child_resp.text)
print(result3.group("movie"))
print(result3.group("download"))
# break # 测试用
bs4#
介绍#
BeautifulSoup是一个用于从 HTML 和 XML 文件中提取数据的 Python 库。
下载bs4
模块#
pip install bs4
实战#
搞搞菜价
# 安装
# pip install bs4 -i 清华
# 1. 拿到页面源代码
# 2. 使用bs4进行解析. 拿到数据
import requests
from bs4 import BeautifulSoup
import csv
url = "http://www.xinfadi.com.cn/marketanalysis/0/list/1.shtml"
resp = requests.get(url)
f = open("菜价.csv", mode="w")
csvwriter = csv.writer(f)
# 解析数据
# 1. 把页面源代码交给BeautifulSoup进行处理, 生成bs对象
page = BeautifulSoup(resp.text, "html.parser") # 指定html解析器
# 2. 从bs对象中查找数据
# find(标签, 属性=值)
# find_all(标签, 属性=值)
# table = page.find("table", class_="hq_table") # class是python的关键字
table = page.find("table", attrs={"class": "hq_table"}) # 和上一行是一个意思. 此时可以避免class
# 拿到所有数据行
trs = table.find_all("tr")[1:]
for tr in trs: # 每一行
tds = tr.find_all("td") # 拿到每行中的所有td
name = tds[0].text # .text 表示拿到被标签标记的内容
low = tds[1].text # .text 表示拿到被标签标记的内容
avg = tds[2].text # .text 表示拿到被标签标记的内容
high = tds[3].text # .text 表示拿到被标签标记的内容
gui = tds[4].text # .text 表示拿到被标签标记的内容
kind = tds[5].text # .text 表示拿到被标签标记的内容
date = tds[6].text # .text 表示拿到被标签标记的内容
csvwriter.writerow([name, low, avg, high, gui, kind, date])
f.close()
print("over1!!!!")
抓取优美图库
# 1.拿到主页面的源代码. 然后提取到子页面的链接地址, href
# 2.通过href拿到子页面的内容. 从子页面中找到图片的下载地址 img -> src
# 3.下载图片
import requests
from bs4 import BeautifulSoup
import time
url = "https://www.umei.cc/bizhitupian/weimeibizhi/"
resp = requests.get(url)
resp.encoding = 'utf-8' # 处理乱码
# print(resp.text)
# 把源代码交给bs
main_page = BeautifulSoup(resp.text, "html.parser")
alist = main_page.find("div", class_="TypeList").find_all("a")
# print(alist)
for a in alist:
href = a.get('href') # 直接通过get就可以拿到属性的值
# 拿到子页面的源代码
child_page_resp = requests.get(href)
child_page_resp.encoding = 'utf-8'
child_page_text = child_page_resp.text
# 从子页面中拿到图片的下载路径
child_page = BeautifulSoup(child_page_text, "html.parser")
p = child_page.find("p", align="center")
img = p.find("img")
src = img.get("src")
# 下载图片
img_resp = requests.get(src)
# img_resp.content # 这里拿到的是字节
img_name = src.split("/")[-1] # 拿到url中的最后一个/以后的内容
with open("img/"+img_name, mode="wb") as f:
f.write(img_resp.content) # 图片内容写入文件
print("over!!!", img_name)
time.sleep(1)
print("all over!!!")
xpath#
介绍#
xpat是在XML文档中搜索内容的一门语言,也可用于html(html是xml的一个子集)
lxml
是一个用于处理 XML 和 HTML 的 Python 库。它功能强大、速度快,并且提供了简单易用的 API。
下载lxml
模块#
pip install lxml
示例#
在xml中定位
from lxml import etree
xml = """
<book>
<id>1</id>
<name>野花遍地香</name>
<price>1.23</price>
<nick>臭豆腐</nick>
<author>
<nick id="10086">周大强</nick>
<nick id="10010">周芷若</nick>
<nick class="joy">周杰伦</nick>
<nick class="jolin">蔡依林</nick>
<div>
<nick>热热热热热1</nick>
</div>
<span>
<nick>热热热热热2</nick>
</span>
</author>
<partner>
<nick id="ppc">胖胖陈</nick>
<nick id="ppbc">胖胖不陈</nick>
</partner>
</book>
"""
# 将字符串扔到etree中
tree = etree.XML(xml)
# 在etree中找目标
# result = tree.xpath('//nick/text()') # ['臭豆腐', '周大强', '周芷若', '周杰伦', '蔡依林', '热热热热热1', '热热热热热2', '胖胖陈', '胖胖不陈']
# result = tree.xpath('/book/author//nick/text()') # ['周大强', '周芷若', '周杰伦', '蔡依林', '热热热热热1', '热热热热热2']
result = tree.xpath('/book/author/*/nick/text()') # ['热热热热热1', '热热热热热2']
print(result)
在html中定位
from lxml import etree
# 将文件扔到etree(加载html文件)
tree = etree.parse("b.html")
# 一、在tree中查找目标
result = tree.xpath("/html")
result = tree.xpath("/html/body/ul/li/a/text()") # ['百度', '谷歌', '搜狗']
# li[]索引从1开始
result = tree.xpath("/html/body/ul/li[1]/a/text()") # ['百度']
# @后跟属性
result = tree.xpath("/html/body/ol/li/a[@href='dapao']/text()") # ['大炮']
print(result)
# 二、拿到li节点列表
ol_li_list = result = tree.xpath("/html/body/ol/li") # [<Element li at 0x267fc717640>, <Element li at 0x267fc717680>, <Element li at 0x267fc7176c0>]
for li in ol_li_list:
# .表当前节点
result = li.xpath("./a/text()")
print(result)
# 拿到ol -> li -> a的属性值
result = li.xpath("./a/@href")
print(result)
# 三、可在浏览器按f12,快速复制元素xpath
实战#
抓取猪八戒网信息
# 拿到页面源代码
# 提取和解析数据
import requests
from lxml import etree
url = "https://beijing.zbj.com/search/f/?type=new&kw=saas"
resp = requests.get(url)
# print(resp.text)
# 解析
html = etree.HTML(resp.text)
# 拿到每一个服务商的div
divs = html.xpath("/html/body/div[6]/div/div/div[2]/div[4]/div[1]/div")
for div in divs: # 每一个服务商信息
price = div.xpath("./div/div/a[1]/div[2]/div[1]/span[1]/text()")[0].strip("¥")
title = "saas".join(div.xpath("./div/div/a[1]/div[2]/div[2]/p/text()"))
com_name = div.xpath("./div/div/a[2]/div[1]/p/text()")[0]
location = div.xpath("./div/div/a[2]/div[1]/div/span/text()")[0]
print(com_name)
作者:cloud-2-jane
出处:https://www.cnblogs.com/cloud-2-jane/articles/18614210
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架