设为首页 收藏本站
查看: 688|回复: 0

[经验分享] Python中第三方的用于解析HTML的库:BeautifulSoup

[复制链接]

尚未签到

发表于 2015-12-2 15:00:14 | 显示全部楼层 |阅读模式
背景
  在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的写法是:



?

1


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的第三方模块,简单说就是,进入对应目录,运行:



?

1


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函数。
  完整代码是:
  



?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42


#!/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();
  输出为:



?

1
2
3
4
5
6
7
8
9
10
11
12
13


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的)的值本身
  
  完整示例代码为:



?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54


#!/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使用注意事项

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-146439-1-1.html 上篇帖子: python中怎么知道是谁调用了自己 下篇帖子: python 自动生成淘宝客链接
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表