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实现简单状态框架的方法
Mar 19 Python
Python 3.x读写csv文件中数字的方法示例
Aug 29 Python
python正则实现计算器功能
Dec 14 Python
TensorFlow 滑动平均的示例代码
Jun 19 Python
python 多线程将大文件分开下载后在合并的实例
Nov 09 Python
Python3标准库总结
Feb 19 Python
Python基础之变量基本用法与进阶详解
Jan 03 Python
TensorFlow dataset.shuffle、batch、repeat的使用详解
Jan 21 Python
win10安装python3.6的常见问题
Jul 01 Python
Python学习工具jupyter notebook安装及用法解析
Oct 23 Python
pycharm安装深度学习pytorch的d2l包失败问题解决
Mar 25 Python
Python数据处理的三个实用技巧分享
Apr 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
Dedecms V3.1 生成HTML速度的优化办法
2007/03/18 PHP
PHP使用GIFEncoder类处理gif图片实例
2014/07/01 PHP
php实现网站留言板功能
2015/11/04 PHP
特殊字符、常规符号及其代码对照表
2006/06/26 Javascript
jQuery checkbox全选/取消全选实现代码
2009/11/14 Javascript
通过Javascript将数据导出到外部Excel文档的函数代码
2012/06/15 Javascript
JavaScript常用的返回,自动跳转,刷新,关闭语句汇总
2015/01/13 Javascript
对JavaScript客户端应用编程的一些建议
2015/06/24 Javascript
JS转换HTML转义符的方法
2016/08/24 Javascript
jQuery Validate插件自定义验证规则的方法
2016/12/27 Javascript
jquery.zclip轻量级复制失效问题
2017/01/08 Javascript
jQuery源码分析之sizzle选择器详解
2017/02/13 Javascript
详解vue2.0脚手架的webpack 配置文件分析
2017/05/27 Javascript
解决vue项目中type=”file“ change事件只执行一次的问题
2018/05/16 Javascript
Vue EventBus自定义组件事件传递
2018/06/25 Javascript
vue实现点击选中,其他的不选中方法
2018/09/05 Javascript
小程序登录之支付宝授权的实现示例
2019/12/13 Javascript
python3实现暴力穷举博客园密码
2016/06/19 Python
Python使用PDFMiner解析PDF代码实例
2017/03/27 Python
Python 实现删除某路径下文件及文件夹的实例讲解
2018/04/24 Python
在keras中对单一输入图像进行预测并返回预测结果操作
2020/07/09 Python
Python Process创建进程的2种方法详解
2021/01/25 Python
HTML5 MiranaVideo播放器 (代码开源)
2010/06/11 HTML / CSS
HTML5 画布canvas使用方法
2016/03/18 HTML / CSS
PurCotton全棉时代官网:100%天然棉花生产的生活护理用品
2016/11/18 全球购物
Spartoo比利时:欧洲时尚购物网站
2017/12/06 全球购物
美国最大的船只买卖在线市场:Boat Trader
2018/08/04 全球购物
TIME时代杂志台湾总代理:台时亚洲
2018/10/22 全球购物
How to spawning asynchronous work in J2EE
2016/08/29 面试题
写自荐信要注意什么
2013/12/26 职场文书
市场推广策划方案
2014/06/02 职场文书
有关环保的标语
2014/06/13 职场文书
个人总结与自我评价
2015/02/14 职场文书
综合素质评价个性发展自我评价
2015/03/06 职场文书
动画电影《擅长捉弄人的高木同学》6月10日上映!
2022/03/20 日漫
《我的美好婚事》动画化决定纪念插画与先导PV公开
2022/04/06 日漫