[python-thirdLib] Python中第三方的用于解析HTML的库:BeautifulSoup

From: http://www.crifan.com/python_third_party_lib_html_parser_beautifulsoup/

 

背景

在Python去写爬虫,网页解析等过程中,比如:

如何用Python,C#等语言去实现抓取静态网页+抓取动态网页+模拟登陆网站

常常需要涉及到HTML等网页的解析。

当然,对于简单的HTML中内容的提取,Python内置的正则表达式Re模块,就足够用了,

但是对于复杂的HTML的处理,尤其是一些非法的,有bug的html代码的处理,那么最好还是用专门的HTML的解析的库。

Python中的,专门用于HTML解析的库,比较好用的,就是BeautifulSoup。

 

BeautifulSoup简介

Python中,专门用于HTML/XML解析的库;

特点是:

即使是有bug,有问题的html代码,也可以解析。

功能很强大;

 

BeautifulSoup的主页是:

http://www.crummy.com/software/BeautifulSoup/

 

BeautifulSoup的版本

BeautifulSoup主要有两个版本:

 

BeautifulSoup 3

之前的,比较早的,是3.x的版本。

BeautifulSoup 3的在线文档

最新的,可用的,在线文档是:

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.html

中文版的是:

http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html

 

下载BeautifulSoup 3

http://www.crummy.com/software/BeautifulSoup/bs3/download//3.x/

中可以下载到很多版本,比如我常用的3.0.6的版本:

BeautifulSoup-3.0.6.py

http://www.crummy.com/software/BeautifulSoup/bs3/download//3.x/BeautifulSoup-3.0.6.py

 

BeautifulSoup 4:缩写为bs4

最新的v4版本的BeautifulSoup,改名为bs4了。

 

注意:

使用bs4时,导入BeautifulSoup的写法是:

from bs4 import BeautifulSoup;

然后就可以像之前3.x中一样,直接使用BeautifulSoup了。

详见:

【已解决】Python3中,已经安装了bs4(Beautifulsoup 4)了,但是却还是出错:ImportError: No module named BeautifulSoup

bs4的在线文档

http://www.crummy.com/software/BeautifulSoup/bs4/doc/

 

下载bs4

http://www.crummy.com/software/BeautifulSoup/bs4/download/

可以下载到对应的bs4的版本,比如:

此时最新的版本是:

beautifulsoup4-4.1.3.tar.gz

http://www.crummy.com/software/BeautifulSoup/bs4/download/beautifulsoup4-4.1.3.tar.gz

BeautifulSoup的用法

如何安装BeautifulSoup

3.0.6之前:无需安装,放到和Python文件同目录下即可使用

3.0.6之前,都是不需要安装的,所以使用起来最简单,直接下载对应的版本,比如:

http://www.crummy.com/software/BeautifulSoup/bs3/download//3.x/BeautifulSoup-3.0.6.py

得到了BeautifulSoup-3.0.6.py,然后改名为:BeautifulSoup.py

然后,放到和你当前的python文件同目录下,比如我当前python文件是:

D:\tmp\tmp_dev_root\python\beautifulsoup_demo\beautifulsoup_demo.py

那就放到

D:\tmp\tmp_dev_root\python\beautifulsoup_demo\

下面,和beautifulsoup_demo.py同目录。

 

3.0.6之后:需要安装BeautifulSoup后才可使用

关于如何安装一个Python的第三方模块,简单说就是,进入对应目录,运行:

setup.py install

详细解释可参考:

【总结】Python安装第三方的库、package的方法

 

如何使用BeautifulSoup

在你的Python文件,此处为beautifulsoup_demo.py,中直接import即可。

 

关于示例html代码,比如使用:

【教程】抓取网并提取网页中所需要的信息 之 Python版

 

相关参考文档:

3.x版本的:

find(name, attrs, recursive, text, **kwargs)

 

使用BeautifulSoup提取html中的某个内容

关于最简单的,最基本的用法,提取html中的某个内容,具体用法,就死使用对应的find函数。

完整代码是:

 

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Function:
【教程】Python中第三方的用于解析HTML的库:BeautifulSoup
http://www.crifan.com/python_third_party_lib_html_parser_beautifulsoup
Author:     Crifan Li
Version:    2012-12-26
Contact:    admin at crifan dot com
"""
from BeautifulSoup import BeautifulSoup;
def beautifulsoupDemo():
demoHtml = """
<html>
<body>
<div class="icon_col">
<h1 class="h1user">crifan</h1>
</div>
</body>
</html>
""";
soup = BeautifulSoup(demoHtml);
print "type(soup)=",type(soup); #type(soup)= <type 'instance'>
print "soup=",soup;
# 1. extract content
# method 1: no designate para name
#h1userSoup = soup.find("h1", {"class":"h1user"});
# method 2: use para name
h1userSoup = soup.find(name="h1", attrs={"class":"h1user"});
# more can found at:
#http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html#find%28name,%20attrs,%20recursive,%20text,%20**kwargs%29
print "h1userSoup=",h1userSoup; #h1userSoup= <h1 class="h1user">crifan</h1>
h1userUnicodeStr = h1userSoup.string;
print "h1userUnicodeStr=",h1userUnicodeStr; #h1userUnicodeStr= crifan
if __name__ == "__main__":
beautifulsoupDemo();

输出为:

D:\tmp\tmp_dev_root\python\beautifulsoup_demo>beautifulsoup_demo.py
type(soup)= <type 'instance'>
soup=
<html>
<body>
<div class="icon_col">
<h1 class="h1user">crifan</h1>
</div>
</body>
</html>
h1userSoup= <h1 class="h1user">crifan</h1>
h1userUnicodeStr= crifan

 

使用BeautifulSoup修改/改变/替换原先html中的某个内容

如果需要改变原先html中的某个值,可以参考官网解释:

修改属性值

后来证实,只能改(Tag的)中的属性的值,不能改(Tag的)的值本身

完整示例代码为:

#!/usr/bin/python
# -*- coding: utf-8 -*-
"""
Function:
【教程】Python中第三方的用于解析HTML的库:BeautifulSoup
http://www.crifan.com/python_third_party_lib_html_parser_beautifulsoup
Author:     Crifan Li
Version:    2013-02-01
Contact:    admin at crifan dot com
"""
from BeautifulSoup import BeautifulSoup;
def beautifulsoupDemo():
demoHtml = """
<html>
<body>
<div class="icon_col">
<h1 class="h1user">crifan</h1>
</div>
</body>
</html>
""";
soup = BeautifulSoup(demoHtml);
print "type(soup)=",type(soup); #type(soup)= <type 'instance'>
print "soup=",soup;
print '{0:=^80}'.format(" 1. extract content ");
# method 1: no designate para name
#h1userSoup = soup.find("h1", {"class":"h1user"});
# method 2: use para name
h1userSoup = soup.find(name="h1", attrs={"class":"h1user"});
# more can found at:
#http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html#find%28name,%20attrs,%20recursive,%20text,%20**kwargs%29
print "h1userSoup=",h1userSoup; #h1userSoup= <h1 class="h1user">crifan</h1>
h1userUnicodeStr = h1userSoup.string;
print "h1userUnicodeStr=",h1userUnicodeStr; #h1userUnicodeStr= crifan
print '{0:=^80}'.format(" 2. demo change tag value and property ");
print '{0:-^80}'.format(" 2.1 can NOT change tag value ");
print "old tag value=",soup.body.div.h1.string; #old tag value= crifan
changedToString = u"CrifanLi";
soup.body.div.h1.string = changedToString;
print "changed tag value=",soup.body.div.h1.string; #changed tag value= CrifanLi
print "After changed tag value, new h1=",soup.body.div.h1; #After changed tag value, new h1= <h1 class="h1user">crifan</h1>
print '{0:-^80}'.format(" 2.2 can change tag property ");   
soup.body.div.h1['class'] = "newH1User";
print "changed tag property value=",soup.body.div.h1; #changed tag property value= <h1 class="newH1User">crifan</h1>
if __name__ == "__main__":
beautifulsoupDemo();

 

总结

更多的,用法和使用心得,部分内容,已整理到:

【总结】Python的第三方库BeautifulSoup的使用心得

【整理】关于Python中的html处理库函数BeautifulSoup使用注意事项

 

有空再统一整理到:

BeautifulSoup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403459.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

VMware 常见使用问题梳理

1.“Transport(VMDB)error -44:Message” 这种情况说明虚拟机的一个服务没有开启&#xff0c;在本机中找到服务&#xff1a;“打开运行”-“services.msc”回车。找到VMware Authorization Service这个服务&#xff0c;启动起来就OK了。 2.提示”此虚拟机被配置为64位操作系统…

图灵社区 : 阅读 : 谁说Vim不是IDE?(三)

图灵社区 : 阅读 : 谁说Vim不是IDE&#xff1f;&#xff08;三&#xff09;Powerline1、下载地址https://github.com/Lokaltog/vim-powerline2、功能说明Powerline是Vim的一个非常漂亮的状态栏插件&#xff0c;安装了Powerline之后&#xff0c;Vim底部将会出现一个增强型状态栏…

uni-app小程序onShow执行两次;微信小程序onShow重复执行原因;导航栏tabBar页的onLoad函数不执行;App.vue页的onShow执行原因;onShow莫名其妙执行

1.只有五种情况会触发导航栏tabBar页的onLoad函数&#xff0c;分别是&#xff1a; –1.1&#xff1a;首次进入到导航栏tabBar页面&#xff1b; –1.2&#xff1a;从微信分享进入的导航栏tabBar页面&#xff1b; –1.3&#xff1a;识别二维码跳转到小程序的导航栏tabBar页面&…

用fiddler抓包小程序

第一步&#xff1a;安装fiddler,保证手机和PC端在同一个wifi下&#xff1b; 第二步&#xff1a;设置属性按图勾选第三步&#xff1a;以上两步设置完后&#xff0c;重启下fiddler(解决本地服务器不能访问)&#xff0c;然后查看本地IP地址第四步&#xff1a;手机设置HTTP代理 我的…

[Python2.x] 标准库 urllib2 的使用细节

From: http://www.cnblogs.com/yuxc/archive/2011/08/01/2123995.html 刚好用到&#xff0c;这篇文章写得不错&#xff0c;转过来收藏。 转载自 道可道 | Python 标准库 urllib2 的使用细节 Python 标准库中有很多实用的工具类&#xff0c;但是在具体使用时&#xff0c;标准…

草稿--Windows消息机制

消息本身是作为一个记录传递给应用程序的&#xff0c;这个记录中包含了消息的类型以及其他信息。 MSG含有来自windows应用程序消息队列的消息信息&#xff0c;它在Windows中声明如下&#xff1a;typedef struct tagMsg{HWND hwnd; // 接受该消息的窗口句柄UINT mes…

微信小程序保存图片到相册;uni-app小程序保存网络图片到相册;小程序保存图片到相册拒绝授权后重新拉起授权;保存图片到系统相册;小程序保存图片测试可以,真机保存图片失败

文末代码可以直接复制使用&#xff0c;图片修改成你的图片路径即可 一、场景&#xff1a; 小程序点击按钮&#xff0c;保存项目内的静态图片或者微信头像或者后端返回的图片&#xff1b; 二、注意点及思路拆分&#xff1a; –2.1&#xff1a;小程序保存图片功能&#xff0c;必须…

数组(待完成)

创建 字面量方式 var arr []; var arr ["成员1", 2];//可以是不同成员构造函数方式 空的 var array new Array(); 指定长度 var array2 new Array(10); 成员值都是undefined。此方式有技巧使用 虽然值是undefined&#xff0c;但join后不会出现undefined字符串 比…

VMware打开虚拟机黑屏

排除系统崩溃的情况&#xff0c;比如开机输入密码之后系统黑屏&#xff0c;此原因是由于显示选项开启了3D加速导致的&#xff0c;具体修改步骤&#xff1a; VM->Settings->Hardware->Display 在右面的内容栏中将 Accelerate 3D graphics 取消打勾&#xff0c;然后重启…

[python3.x] 利用chardet检测网页编码

环境&#xff1a;Win7_x64 python3.4.3 需要先下载chardet并进行安装&#xff0c;下载地址&#xff1a;https://pypi.python.org/packages/source/c/chardet/chardet-2.3.0.tar.gz 安装&#xff1a;进入解压后的目录&#xff0c;在命令窗口执行: python setup.py install 写…

js moment时间戳与时间格式相互转换

var moment require(moment) 获取时间戳 : var res moment(Date.now(), YYYY-MM-DD HH:mm:ss).valueOf(); 获取格式时间: var res moment(Date.now()).format(YYYY-MM-DD HH:mm:ss);

微信小程序中base64转换成图片;uni-app小程序base64转图片;微信小程序base64文件转图片;微信小程序base64图片转图片

将微信小程序的图片转成base64 点击此链接看另一篇 以下是将后端返回的base64转成图片&#xff1a; 方法1&#xff1a;使用微信小程序自带方法 //把base64转换成图片getBase64ImageUrl: (base64Url) {/// 获取到base64Datavar base64Data base64Url;/// 通过微信小程序自带方…

PHP流式上传和表单上传(美图秀秀)

最近需要开发一个头像上传的功能&#xff0c;找了很多都需要授权的&#xff0c;后来找到了美图秀秀&#xff0c;功能非常好用。 <?php /*** Note:for octet-stream upload* 这个是流式上传PHP文件* Please be amended accordingly based on the actual situation*/ $post_i…

Linux下如何安装最新版本工具

此博文主要考虑到两个方面的需求&#xff1a; 1.主机处于离线状态&#xff0c;需要离线安装相关工具包&#xff1b; 2.主机的软件源不是最新的&#xff0c;通过在线更新无法达到需求的版本&#xff1b; 此文以获取openssh相关工具包&#xff0c;其他工具包原理类似&#xff…

element-ui 设置table width %百分比

这里的width12设置成min-width!2% 记得所有column都设置百分比哦 <el-table-columnprop"date"label"日期"min-width"12%"></el-table-column>

笔记一

1、logo用<a>标签包围 并给img设置&#xff1a;border&#xff1a;0&#xff08;放置IE浏览器出现框&#xff09; 2、搜索框内有图片&#xff0c;处理方式&#xff1a; 父级div设置border&#xff0c;并调好位置 子级input设置border 0 ;height 100% 图标用<span>包…

[笔记]java-package

[笔记]java&#xff0d;package import 关键字导入一个完整的库时,就会获得“包”(Package)。例如: import java.util.*; 若想导入单独一个类,可在 import 语句里指定那个类的名字: import java.util.Vector; 为 Java 创建一个源码文件的时候,它通常叫作一个“编辑单元”(有时也…

如何安装sshd服务用于远程登录

此博文前提是系统默认没有安装openssh-server&#xff0c;而且现在大部分系统默认只包含openssh-client&#xff0c;这对于需要远程调试和管理的开发者们很不方便&#xff0c;因此本文探讨如何离线安装sshd服务&#xff0c;对于可以在线安装的就比较方便了&#xff0c;可参阅其…

C++中const、volatile、mutable的用法

From: http://blog.csdn.net/wuliming_sc/article/details/3717017 const修饰普通变量和指针 const修饰变量&#xff0c;一般有两种写法&#xff1a; const TYPE value; TYPE const value; 这两种写法在本质上是一样的。它的含义是&#xff1a;const修饰的类型为TYPE的变…

调用未绑定的父类方法和使用supper 函数 之间的选择.

class New_int(int): # 定义一个新的类 继承 int 类def __add__(self,other): # 重写 运算符 # __add__ 就是 int 中 的行为return int.__sub__(self,other) # 重写的 加法运算符 调用 int类 里面的 减法运算运算符def __sub__(self,other):return int.__add__(self…