Python使用BeautifulSoup4修改网页内容


Posted in Python onMay 20, 2022

最近有个小项目,需要爬取页面上相应的资源数据后,保存到本地,然后将原始的HTML源文件保存下来,对HTML页面的内容进行修改将某些标签整个给替换掉。

对于这类需要对HTML进行操作的需求,最方便的莫过于 BeautifulSoup4 的库了。

样例的HTML代码如下:

<html>
<body>
    <a class="videoslide" href="http://www.test.com/wp-content/uploads/1020/1381824922.JPG" rel="external nofollow"  rel="external nofollow" >
       <img src="http://www.test.com/wp-content/uploads/1020/1381824922_zy_compress.JPG" data-zy-media-id="zy_location_201310151613422786"/>
    </a>
    <a href="http://www.test.com/wp-content/uploads/1020/第一张_1381824798.JPG" rel="external nofollow"  rel="external nofollow" >
       <img data-zy-media-id="zy_image_201310151613169945" src="http://www.test.com/wp-content/uploads/1020/第一张_1381824798_zy_compress.JPG"/></a>
    <a href="http://www.test.com/wp-content/uploads/1020/第二张_1381824796.jpg" rel="external nofollow"  rel="external nofollow" >
       <img data-zy-media-id="zy_image_201310151613163009" src="http://www.test.com/wp-content/uploads/1020/第二张_1381824796_zy_compress.jpg"/>
    </a>
    <a href="http://www.test.com/wp-content/uploads/1020/第三张.jpg" rel="external nofollow"  rel="external nofollow" >
       <img data-zy-media-id="zy_image_201312311838584446" src="http://www.test.com/wp-content/uploads/1020/第三张_zy_compress.jpg"/>
    </a>
</body>
</html>

这里主要包括了 <a > 标签, <a > 标签里面嵌入了 <img > 标签,其中有 <a class="videoslide"> 的标识该标签实际是可以播放动画的。需要根据 class="videoslide" 来判断将整个 <a > 标签换成播放器的 <video > 标签,将没有 class="videoslide" 的 <a > 标签换成 <figure> 标签。

也就是将带有的 <a class="videoslide" ...><img ... /></a> 标签换成

<div class="video">
<video controls width="100%" poster="视频链接的图片地址.jpg">
    <source src="视频文件的静态地址.mp4" type="video/mp4" />
    您的浏览器不支持H5视频,请使用Chrome/Firefox/Edge浏览器。
</video>
</div>

将 <a ....><img .../></a> 标签换成

<figure>
    < img src="图片地址_compressed.jpg" data-zy-media-id="图片地址.jpg">
    <figcaption>文字说明(如果有)</figcaption>
</figure>

这里通过BeautifulSoup4 的select()方法找到标签,通过get()方法获取标签及标签属性值,通过replaceWith来替换标签,具体代码如下:

首先安装BeautifulSoup4的库,BeautifulSoup4库依赖于lxml库,所以也需要安装lxml库。

pip install bs4
pip install lxml

具体代码实现如下:

import os
from bs4 import BeautifulSoup
htmlstr='<html><body>' \
        '<a class="videoslide" href="http://www.test.com/wp-content/uploads/1020/1381824922.JPG" rel="external nofollow"  rel="external nofollow" >' \
        '<img src="http://www.test.com/wp-content/uploads/1020/1381824922_zy_compress.JPG" data-zy-media-id="zy_location_201310151613422786"/></a>' \
        '<a href="http://www.test.com/wp-content/uploads/1020/第一张_1381824798.JPG" rel="external nofollow"  rel="external nofollow" >' \
        '<img data-zy-media-id="zy_image_201310151613169945" src="http://www.test.com/wp-content/uploads/1020/第一张_1381824798_zy_compress.JPG"/></a>' \
        '<a href="http://www.test.com/wp-content/uploads/1020/第二张_1381824796.jpg" rel="external nofollow"  rel="external nofollow" >' \
        '<img data-zy-media-id="zy_image_201310151613163009" src="http://www.test.com/wp-content/uploads/1020/第二张_1381824796_zy_compress.jpg"/></a>' \
        '<a href="http://www.test.com/wp-content/uploads/1020/第三张.jpg" rel="external nofollow"  rel="external nofollow" >' \
        '<img data-zy-media-id="zy_image_201312311838584446" src="http://www.test.com/wp-content/uploads/1020/第三张_zy_compress.jpg"/></a>' \
        '</body></html>'

def procHtml(htmlstr):
    soup = BeautifulSoup(htmlstr, 'lxml')
    a_tags=soup.select('a')
    for a_tag in a_tags:
        a_tag_src = a_tag.get('href')
        a_tag_filename = os.path.basename(a_tag_src)
        a_tag_path = os.path.join('src', a_tag_filename)
        a_tag['href']=a_tag_path
        next_tag=a_tag.next
        #判断是视频还是图片,如果a标签带了class="videoslide" 是视频否则是图片
        if a_tag.get('class') and 'videoslide'==a_tag.get('class')[0]:
            # 处理视频文件
            media_id = next_tag.get('data-zy-media-id')
            if media_id:
                media_url = 'http://www.test.com/travel/show_media/' + str(media_id)+'.mp4'
                media_filename = os.path.basename(media_url)
                media_path = os.path.join('src', media_filename)
                # 将div.video标签替换a标签
                video_html = '<div class=\"video\"><video controls width = \"100%\" poster = \"' + a_tag_path + '\" ><source src = \"' + media_path + '\" type = \"video/mp4\" /> 您的浏览器不支持H5视频,请使用Chrome / Firefox / Edge浏览器。 </video></div>'
                video_soup = BeautifulSoup(video_html, 'lxml')
                a_tag.replaceWith(video_soup.div)
        else:
            #获取图片信息
            if 'img'==next_tag.name:
                img_src=next_tag.get('src')
                # 判断是否路径是否为本地资源 data:image和file:
                if img_src.find('data:image') == -1 and img_src.find('file:') == -1:
                    img_filename = os.path.basename(img_src)
                    img_path = os.path.join('src', img_filename)
                    # 将<figure><img>标签替换a标签
                    figcaption=''
                    figure_html='<figure><img src=\"'+img_path+'\" data-zy-media-id=\"'+a_tag_path+'\"><figcaption>'+figcaption+'</figcaption></figure>'
                    figure_soup = BeautifulSoup(figure_html, 'lxml')
                    a_tag.replaceWith(figure_soup.figure)
    html_content = soup.contents[0]
    return html_content

if __name__ == '__main__':
    pro_html_str=procHtml(htmlstr)
    print(pro_html_str)

结果:

<html>
<body>
<div class="video">
<video controls="" poster="src\1381824922.JPG" width="100%">
<source src="src\zy_location_201310151613422786.mp4" type="video/mp4"/> 您的浏览器不支持H5视频,请使用Chrome / Firefox / Edge浏览器。 
</video>
</div>
<figure>
<img data-zy-media-id="src\第一张_1381824798.JPG" src="src\第一张_1381824798_zy_compress.JPG"/>
<figcaption></figcaption>
</figure>
<figure>
<img data-zy-media-id="src\第二张_1381824796.jpg" src="src\第二张_1381824796_zy_compress.jpg"/>
<figcaption></figcaption></figure>
<figure>
<img data-zy-media-id="src\第三张.jpg" src="src\第三张_zy_compress.jpg"/>
<figcaption></figcaption>
</figure>
</body>
</html>

总结 

到此这篇关于Python使用BeautifulSoup4修改网页内容的文章就介绍到这了!


Tags in this post...

Python 相关文章推荐
Python合并两个字典的常用方法与效率比较
Jun 17 Python
Python操作Access数据库基本步骤分析
Sep 19 Python
windows下ipython的安装与使用详解
Oct 20 Python
简单谈谈Python中的闭包
Nov 30 Python
Python 关于反射和类的特殊成员方法
Sep 14 Python
Python3 queue队列模块详细介绍
Jan 05 Python
pip命令无法使用的解决方法
Jun 12 Python
在Python中将函数作为另一个函数的参数传入并调用的方法
Jan 22 Python
python多进程下的生产者和消费者模型
May 07 Python
使用Keras训练好的.h5模型来测试一个实例
Jul 06 Python
python文件编写好后如何实践
Jul 07 Python
python实现简单的五子棋游戏
Sep 01 Python
python标准库ElementTree处理xml
May 20 #Python
Python中使用tkFileDialog实现文件选择、保存和路径选择
May 20 #Python
Python Flask实现进度条
May 11 #Python
Python PIL按比例裁剪图片
May 11 #Python
python 学习GCN图卷积神经网络
May 11 #Python
Python+Pillow+Pytesseract实现验证码识别
May 11 #Python
Python 绘制多因子柱状图
You might like
php使用正则验证中文
2016/04/06 PHP
ThinkPHP5 框架引入 Go AOP,PHP AOP编程项目详解
2020/05/12 PHP
在网页中屏蔽快捷键
2006/09/06 Javascript
jQuery版Tab标签切换
2011/03/16 Javascript
jquery批量控制form禁用的代码
2013/08/06 Javascript
简单的Jquery全选功能
2013/11/07 Javascript
jQuery链式操作实例分析
2015/11/16 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
JSON 对象未定义错误的解决方法
2016/09/29 Javascript
jQuery代码实现实时获取时间
2017/01/29 Javascript
this.$toast() 了解一下?
2019/04/18 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
js实现tab栏切换效果
2020/08/02 Javascript
javascript实现扫雷简易版
2020/08/18 Javascript
微信小游戏中three.js离屏画布的示例代码
2020/10/12 Javascript
[02:46]完美世界DOTA2联赛PWL DAY4集锦
2020/11/03 DOTA
python中的对象拷贝示例 python引用传递
2014/01/23 Python
Python 探针的实现原理
2016/04/23 Python
python日志记录模块实例及改进
2017/02/12 Python
基于python的socket实现单机五子棋到双人对战
2020/03/24 Python
opencv python 图像轮廓/检测轮廓/绘制轮廓的方法
2019/07/03 Python
pyspark 随机森林的实现
2020/04/24 Python
Python Tkinter图形工具使用方法及实例解析
2020/06/15 Python
CSS3 实现时间轴动画
2020/11/25 HTML / CSS
Jabra捷波朗美国官网:用于办公、车载和运动的无线蓝牙耳麦
2017/02/01 全球购物
香港莎莎官网Sasa.com:亚洲著名国际化妆品商城
2019/11/10 全球购物
温泉秘密:Onsen Secret
2020/07/06 全球购物
CHRONEXT英国:您的首选奢华腕表目的地
2020/03/30 全球购物
说一下Linux下有关用户和组管理的命令
2014/08/18 面试题
小学教师的个人自我鉴定
2013/10/24 职场文书
小学生获奖感言范文
2014/02/02 职场文书
小学六一儿童节活动方案
2014/08/27 职场文书
2019年二手房买卖合同范本
2019/10/14 职场文书
导游词之宁夏贺兰山岩画
2019/11/08 职场文书
导游词之无锡华莱坞
2019/12/02 职场文书
Mysql数据库中datetime、bigint、timestamp来表示时间选择,谁来存储时间效率最高
2021/08/23 MySQL