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访问sqlserver示例
Feb 10 Python
Python使用稀疏矩阵节省内存实例
Jun 27 Python
跟老齐学Python之??碌某?? target=
Sep 12 Python
Python 中pandas.read_excel详细介绍
Jun 23 Python
python tensorflow学习之识别单张图片的实现的示例
Feb 09 Python
Python3中内置类型bytes和str用法及byte和string之间各种编码转换 问题
Sep 27 Python
对python 多线程中的守护线程与join的用法详解
Feb 18 Python
Django 静态文件配置过程详解
Jul 23 Python
快速解决Django关闭Debug模式无法加载media图片与static静态文件
Apr 07 Python
Python-jenkins模块之folder相关操作介绍
May 12 Python
基于python实现图片转字符画代码实例
Sep 04 Python
python获取天气接口给指定微信好友发天气预报
Dec 28 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 日期加减的类,很不错
2009/10/10 PHP
PHP转盘抽奖接口实例
2015/02/09 PHP
php通过分类列表产生分类树数组的方法
2015/04/20 PHP
php中使用base HTTP验证的方法
2015/04/20 PHP
laravel 实现上传图片到本地和前台访问示例
2019/10/21 PHP
在JavaScript中遭遇级联表达式陷阱
2007/03/08 Javascript
Mootools 1.2教程 选项卡效果(Tabs)
2009/09/15 Javascript
js如何获取file控件的完整路径具体实现代码
2013/05/15 Javascript
Jquery绑定事件(bind和live的区别介绍)
2013/08/23 Javascript
js使用DOM设置单选按钮、复选框及下拉菜单的方法
2015/01/20 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
JavaScript 封装一个tab效果源码分享
2015/09/15 Javascript
BootStrap下jQuery自动完成的样式调整
2016/05/30 Javascript
JavaScript队列、优先队列与循环队列
2016/11/14 Javascript
canvas绘制的直线动画
2017/01/23 Javascript
JavaScript 实现 Tab 点击切换实例代码
2017/03/25 Javascript
浅谈JavaScript find 方法不支持IE的问题
2017/09/28 Javascript
详解基于vue-router的动态权限控制实现方案
2017/09/28 Javascript
jQuery niceScroll滚动条错位问题的解决方法
2018/02/03 jQuery
简单实现节流函数和防抖函数过程解析
2019/10/08 Javascript
JS插件amCharts实现绘制柱形图默认显示数值功能示例
2019/11/26 Javascript
javascript实现弹出层效果
2019/12/10 Javascript
带你使用webpack快速构建web项目的方法
2020/11/12 Javascript
Python cookbook(字符串与文本)针对任意多的分隔符拆分字符串操作示例
2018/04/19 Python
详解Python连接MySQL数据库的多种方式
2019/04/16 Python
Python3.5基础之NumPy模块的使用图文与实例详解
2019/04/24 Python
经验丰富程序员才知道的8种高级Python技巧
2020/07/27 Python
科茨沃尔德家居商店:Scotts of Stow
2018/06/29 全球购物
会计系中文个人求职信
2013/12/24 职场文书
财务学生的职业生涯发展
2014/02/11 职场文书
新年寄语大全
2014/04/12 职场文书
2014年社区国庆节活动方案
2014/09/16 职场文书
违反学校规则制度检讨书
2015/01/01 职场文书
英语复习计划
2015/01/19 职场文书
大学生逃课检讨书
2015/05/04 职场文书
2015秋季运动会通讯稿
2015/07/18 职场文书