文档章节

BeautifulSoup安装及其应用

Prefecter
 Prefecter
发布于 2014/01/02 20:48
字数 2382
阅读 7961
收藏 5
点赞 0
评论 0

BeautifulSoup 安装及其使用

BeautifulSoup 是个好东东。

官网见这里: http://www.crummy.com/software/BeautifulSoup/

下载地址见这里:http://www.crummy.com/software/BeautifulSoup/bs4/download/4.1/ 附件有4.1.2的安装源码

文档见这里: http://www.crummy.com/software/BeautifulSoup/bs3/documentation.zh.html ,是中文翻译的,不过文档有点旧,是 3.0 的文档版本,看起来没有什么意思。

我推荐大家看个: http://www.crummy.com/software/BeautifulSoup/bs4/doc/ ,这个是 python 的官网英文版,看起来要舒服,清晰很多。

在 python 下,你想按照 jquery 格式来读取网页,免除网页格式、标签的不规范的困扰,那么 BeautifulSoup 是个不错的选择。按照官网所说, BeautifulSoup 是 Screen-Scraping 应用,旨在节省大家处理 HTML 标签,并且从网络中获得信息的工程。 BeautifulSoup 有这么几个优点,使得其功能尤其强大:

1 : Beautiful Soup provides a few simple methods and Pythonic idioms for navigating, searching, and modifying a parse tree: a toolkit for dissecting a document and extracting what you need. It doesn't take much code to write an application 。关键词: python 风格、提供简单方法

2 : Beautiful Soup automatically converts incoming documents to Unicode and outgoing documents to UTF-8. You don't have to think about encodings, unless the document doesn't specify an encoding and Beautiful Soup can't autodetect one. Then you just have to specify the original encoding 。关键词:编码转换,使用 Python 的同学都会认同Python 编码格式的繁琐, BeautifulSoup 能简化这一点。

3 : Beautiful Soup sits on top of popular Python parsers like lxml and html5lib , allowing you to try out different parsing strategies or trade speed for flexibility 。关键词:兼容其它 html 解析器,能够让你随心替换。

看完这几个特性,想必有人心动了吧,我们先看下 BeautifulSoup 的安装:

安装方法:

1 : apt-get install python-bs4

2 : easy_install beautifulsoup4

3 : pip install beautifulsoup4

4 :源码安装: python setup.py install

 

根据不同的操作系统,选用不同的安装方法,这些方法都能安装成功,不同点在于安装的工具不同。我自己的系统采用的是第四种安装方法,下面我来简要介绍下第四种安装方法:

 

Python代码  收藏代码

  1. curl http://www.crummy.com/software/BeautifulSoup/bs4/download/4.1/beautifulsoup4-4.1.2.tar.gz >> beautifulsoup4-4.1.2.tar.gz  

  2. tar zxvf beautifulsoup4-4.1.2.tar.gz  

  3. cd beautifulsoup4-4.1.2  

  4. python setup.py install  

 

Ok ,你就能看到安装信息,提示安装成功。

 

安装成功,肯定想迫不及待的使用,你打开 python command 窗口,你很 happy 的输入:

 

Python代码  收藏代码

  1. from beautifulsoup import beautifulsoup  

 

sorry , ImportError ,为什么会有这个 import error ,我都安装好了的。打开官网,重新看下说明,原来安装的是BeautifulSoup 4.1 版本,这个 import 是 3.x 的说法。重新打开 command ,输入:

 

Python代码  收藏代码

  1. import bs4

  2. from bs4 import BeautifulSoup  

咦,没有输出提示。恭喜你, BeautifulSoup 包引入成功。

看文上篇博客, http://isilic.iteye.com/blog/1733560 ,想试下 dir 命令,看看 BeautifulSoup 提供了哪些方法:

 

Python代码  收藏代码

  1. dir(BeautifulSoup)  

 看到一堆的方法,有点头大,将方法列出来会方便看许多。

 

Python代码  收藏代码

  1. >>> for method in dir(BeautifulSoup):  

  2. ...        print method  

  3. ...  

 

       请仔细看下其中的 findXxx , nextXxx , previousXxx 方法,这些方法提供了 html 页面的遍历、回溯、查找、匹配功能;这些功能已经能够提供获取页面信息的方法了。

我们以百度首页为例,试用下 BeautifulSoup 的强大功能。

 

Python代码  收藏代码

  1. >>> import urllib2  

  2. >>> page=urllib2.urlopen('http://www.baidu.com')  

  3. >>> soup=BeautifulSoup(page)  

  4. >>> print soup.title  

  5. >>> soup.title.string  

 

看到结果显示不错, helloworld 的教程让人心里真是舒服啊。

想进一步试用功能,我想找出百度首页上所有的链接,这个貌似很难,需要各种正则匹配,各种处理;等等,我们现在是在谈论这个 BeautifulSoup ,看看 BeautifulSoup 怎么实现这个功能。

Python代码  收藏代码

  1. >>> for lind in soup.find_all('a'):  

  2. ...   print lind['href']  

  3. ...  

 

看到输出了吗?是不是很简单。

 

对于熟悉 Jquery 和 CSS 的同学,这种操作就是个折磨,需要不停的根据选择出来的结果进行遍历。看到上面的输出,看到有很多的 # 这些非正常的 URL ,现在想把这些 URL 全部过滤掉,使用 select 语法就很简单了。

Python代码  收藏代码

  1. >>> for link in soup.select('a[href^=http]'):  

  2. ...   print link['href'];  

  3. ...  

 

有人说我根据判断出来的 URL 做处理不行嘛,当然可以,我这里只是想试下 select 的语法,至于 select 中的语法定义,大家可以自行度之。准确的说,这个 select 语法都能重新开篇文章了。

再进一步,连接中的 / 或者 /duty 链接都是有含义的,是相对于本站的绝对地址,这些 / 开头的怎么不被过滤掉?如果是绝对地址的话,又该怎么防止被过滤掉? href 标签里面是个 javascript 又该怎么过滤?如果考虑 css 文件和js 文件的话,怎么把这些文件的 url 也给找出来?还有更进一步的,怎么分析出 js 中 ajax 的请求地址?这些都是可以进一步扩展的一些要求。

好吧,我承认后面这些 URL 过滤已经超出了 BeautifulSoup 的能力范围了,但是单纯考虑功能的话,这些都是要考虑的内容,这些疑问大家考虑下实现原理就行,如果能做进一步的学习的话,算是本文额外的功劳了。

 

下面简单过下 BeautifulSoup 的用法:

 

Python代码  收藏代码

  1. DEFAULT_BUILDER_FEATURES  

  2. FORMATTERS  

  3. ROOT_TAG_NAME  

  4. STRIP_ASCII_SPACES:BeautifulSoup的内置属性  

  5. __call__  

  6. __class__  

  7. __contains__  

  8. __delattr__  

  9. __delitem__  

  10. __dict__  

  11. __doc__  

  12. __eq__  

  13. __format__  

  14. __getattr__  

  15. __getattribute__  

  16. __getitem__  

  17. __hash__  

  18. __init__  

  19. __iter__  

  20. __len__  

  21. __module__  

  22. __ne__  

  23. __new__  

  24. __nonzero__  

  25. __reduce__  

  26. __reduce_ex__  

  27. __repr__  

  28. __setattr__  

  29. __setitem__  

  30. __sizeof__  

  31. __str__  

  32. __subclasshook__  

  33. __unicode__  

  34. __weakref__  

  35. _all_strings  

  36. _attr_value_as_string  

  37. _attribute_checker  

  38. _feed  

  39. _find_all  

  40. _find_one  

  41. _lastRecursiveChild  

  42. _last_descendant  

  43. _popToTag:BeautifulSoup的内置方法,关于这些方法使用需要了解Python更深些的内容。  

  44. append:修改element tree  

  45. attribselect_re  

  46. childGenerator  

  47. children  

  48. clear:清除标签内容  

  49. decode  

  50. decode_contents  

  51. decompose  

  52. descendants  

  53. encode  

  54. encode_contents  

  55. endData  

  56. extract:这个方法很关键,后面有介绍  

  57. fetchNextSiblings下一兄弟元素  

  58. fetchParents:父元素集  

  59. fetchPrevious:前一元素  

  60. fetchPreviousSiblings:前一兄弟元素:这几个能够对当前元素的父级别元素和兄弟级别进行查找。  

  61. find:只找到limit为1的结果  

  62. findAll  

  63. findAllNext  

  64. findAllPrevious  

  65. findChild  

  66. findChildren:子集合  

  67. findNext:下一元素  

  68. findNextSibling:下一个兄弟  

  69. findNextSiblings:下一群兄弟  

  70. findParent:父元素  

  71. findParents:所有的父元素集合  

  72. findPrevious  

  73. findPreviousSibling  

  74. findPreviousSiblings:对当前元素和子元素进行遍历查找。  

  75. find_all_next  

  76. find_all_previous  

  77. find_next  

  78. find_next_sibling  

  79. find_next_siblings  

  80. find_parent  

  81. find_parents  

  82. find_previous  

  83. find_previous_sibling  

  84. find_previous_siblings:这些下划线方法命名是bs4方法,推荐使用这类  

  85. format_string  

  86. get  

  87. getText  

  88. get_text:得到文档标签内的内容,不包括标签和标签属性  

  89. handle_data  

  90. handle_endtag  

  91. handle_starttag  

  92. has_attr  

  93. has_key  

  94. index  

  95. insert  

  96. insert_after  

  97. insert_before:修改element tree  

  98. isSelfClosing  

  99. is_empty_element  

  100. new_string  

  101. new_tag  

  102. next  

  103. nextGenerator  

  104. nextSibling  

  105. nextSiblingGenerator  

  106. next_elements  

  107. next_siblings  

  108. object_was_parsed  

  109. parentGenerator  

  110. parents  

  111. parserClass  

  112. popTag  

  113. prettify:格式化HTML文档  

  114. previous  

  115. previousGenerator  

  116. previousSibling  

  117. previousSiblingGenerator  

  118. previous_elements  

  119. previous_siblings  

  120. pushTag  

  121. recursiveChildGenerator  

  122. renderContents  

  123. replaceWith  

  124. replaceWithChildren  

  125. replace_with  

  126. replace_with_children:修改element tree 元素内容  

  127. reset  

  128. select:适用于jquery和css的语法选择。  

  129. setup  

  130. string  

  131. strings  

  132. stripped_strings  

  133. tag_name_re  

  134. text  

  135. unwrap  

  136. wrap  

 

 

需要注意的是,在BeautifulSoup中的方法有些有两种写法,有些是驼峰格式的写法,有些是下划线格式的写法,但是看其方法的含义是一样的,这主要是BeautifulSoup为了兼容3.x的写法。前者是3.x的写法,后者是4.x的写法,推荐使用后者,也就是下划线的方法。

 

根据这些方法,应该能够得到遍历、抽取、修改、规范化文档的一系列方法。大家如果能在工作中使用BeautifulSoup ,一定会理解更深。

 

BeautifulSoup 支持不同的 parser ,默认是 Html 格式解析,还有 xml parser 、 lxml parser 、 html5lib parser 、html.parser ,这些 parser 都需要响应的解析器支持。

 html,这个是默认的解析器

Python代码  收藏代码

  1. BeautifulSoup("<a><b /></a>")  

  2. # <html><head></head><body><a><b></b></a></body></html>  

 

 xml格式解析器

Python代码  收藏代码

  1. BeautifulSoup("<a><b /></a>""xml")  

  2. # <?xml version="1.0" encoding="utf-8"?>  

  3. # <a><b /></a>  

 

 lxml格式解析器

Python代码  收藏代码

  1. BeautifulSoup("<a></p>""lxml")  

  2. # <html><body><a></a></body></html>  

 

 html5lib格式解析器

Python代码  收藏代码

  1. BeautifulSoup("<a></p>""html5lib")  

  2. # <html><head></head><body><a><p></p></a></body></html>  

 

 html.parser解析器

Python代码  收藏代码

  1. BeautifulSoup("<a></p>""html.parser")  

  2. # <a></a>  

 

 

其中 parser 的区别大家看下这几个例子就知道了。

 

在使用 BeautifulSoup 解析文档的时候,会将整个文档以一颗大又密集的数据载入到内存中,如果你只是从数据结构中获得一个字符串,内存中保存一堆数据感觉就不划算了。并且如果你要获得指向某个 Tag 的内容,这个 Tag又会指向其它的 Tag 对象,因此你需要保存这棵树的所有部分,也就是说整棵树都在内存中。 extract 方法可以破坏掉这些链接,它会将树的连接部分断开,如果你得到某个 Tag ,这个 Tag 的剩余部分会离开这棵树而被垃圾收集器捕获;当然,你也可以实现其它的功能:如文档中的某一块你本身就不关心,你可以直接把它 extract 出树结构,扔给垃圾收集器,优化内存使用的同时还能完成自己的功能。

 

正如 BeautifulSoup 的作者 Leonard 所说,写 BeautifulSoup 是为了帮助别人节省时间,减小工作量。一旦习惯使用上 BeautifulSoup 后,一些站点的内容很快就能搞定。这个就是开源的精神,将工作尽可能的自动化,减小工作量;从某个程度上来说,程序员应该是比较懒惰的,但是这种懒惰正好又促进了软件行业的进步。


导入模块时按照原始博文http://isilic.iteye.com/blog/1741918 总是不对,我尝试import bs4   from bs4 import beautifulsoup  就可一了


本文转载自:http://isilic.iteye.com/blog/1741918

共有 人打赏支持
Prefecter
粉丝 1
博文 2
码字总数 2335
作品 0
安阳
python---easy_install 安装软件 及BeautifulSoup 中文乱码

安装easyinstall工具 使用ezsetup.py脚本方便安装: 安装Mechanize 和 BeautifulSoup,可以执行如下命令,系统会自动在pypi网站列表里查找相关软件包: easyinstall Mechanize easyinstall ...

durban
2012/04/10
0
0
python BeautifulSoup模块的安装

python BeautifulSoup模块的安装 ···一个BeautifulSoup的模块,安装就浪费了俺这么长时间,下载的是BeautifulSoup4-4.1.3, 安装的时候就是 python setup.py build python setup.py inst...

昏鸦
2014/10/17
0
2
ubuntu12.04 安装BeautifulSoup遇到的问题

root@ubuntu :/home/chris# apt-get install python-setuptools Reading package lists... Done Building dependency tree Reading state information... Done The following packages were ......

durban
2012/05/18
0
0
python中用beautifulSoup+urlib2 安装、抓取和解析网页,以及解析shtml

安装 Beautiful Soup¶ 如果你用的是新版的Debain或ubuntu,那么可以通过系统的软件包管理来安装: $ apt-get install Python-bs4 Beautiful Soup 4 通过PyPi发布,所以如果你无法使用系统包管理...

不容置喙
2014/10/05
0
0
ImportError: No module named 'requests'

补充说明: 当前环境是在windows环境下 python版本是:python 3.4. 刚开始学习python,一边看书一边论坛里阅读感兴趣的代码, http://www.oschina.net/code/snippet140626643470 的代码运行报...

庸夫俗子
2014/11/06
0
0
(转)Python中第三方模块的使用心得

前面已经说了,其实学习Python的过程,很多时候就是在学习如何使用第三方模块,完成自己需要的功能。 关于Python的第三方库类库,其实网上很多很多相关资料。 其中,官网的Python库:Python ...

Dyllian
2013/05/22
0
0
BeautifulSoup学习笔记1

from bs4 import BeautifulSoup BeautifulSoup是一个类,继承了Tag类.每个BeautifulSoup对象实例,通过html内容进行构建.如下: bsObj=BeautifulSoup(urllib.request.urlopen(url).read()) Bea......

Aomo
05/14
0
0
BeautifulSoup3 编码问题总结

关于 BeautifulSoup3 对 gb2312 编码的网页解析的乱码问题,【这篇文章】提出了一个勉强能用的解决方法。即如果中文页面编码是 gb2312,gbk,在 BeautifulSoup 构造器中传入 fromEncoding="...

不必在乎朕是谁
2013/03/28
0
0
用虚拟环境保存库文件--Python打包

用虚拟环境保存库文件 如果你同时负责多个 Python 项目,或者想要轻松打包某个项目及其关联的库文件,再 或者你担心已安装的库之间可能有冲突,那么你可以安装一个 Python 虚拟环境来分而 治...

AltBoy
06/29
0
0
实战(二)轻松使用requests库和beautifulsoup爬链接

前言 实战(一)之使用自带urllib和re正则表达式获取电影详情页链接 其实大多情况下,python自带的urllib和re正则表达式已经可以满足我们的日常需求了,但是,聪明的世人怎么会满足于此呢,只...

鱼头豆腐文
2017/12/03
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

shell中的函数、shell中的数组、告警系统需求分析

shell中的函数 格式: 格式: function f_name() { command } 函数必须要放在最前面 示例1(用来打印参数) 示例2(用于定义加法) 示例3(用于显示IP) shell中的数组 shell中的数组1 定义数...

Zhouliang6
今天
2
0
用 Scikit-Learn 和 Pandas 学习线性回归

      对于想深入了解线性回归的童鞋,这里给出一个完整的例子,详细学完这个例子,对用scikit-learn来运行线性回归,评估模型不会有什么问题了。 1. 获取数据,定义问题     没有...

wangxuwei
今天
1
0
MAC安装MAVEN

一:下载maven压缩包(Zip或tar可选),解压压缩包 二:打开终端输入:vim ~/.bash_profile(如果找不到该文件新建一个:touch ./bash_profile) 三:输入i 四:输入maven环境变量配置 MAVEN_HO...

WALK_MAN
今天
0
0
33.iptables备份与恢复 firewalld的9个zone以及操作 service的操作

10.19 iptables规则备份和恢复 10.20 firewalld的9个zone 10.21 firewalld关于zone的操作 10.22 firewalld关于service的操作 10.19 iptables规则备份和恢复: ~1. 保存和备份iptables规则 ~2...

王鑫linux
今天
2
0
大数据教程(2.11):keeperalived+nginx高可用集群搭建教程

上一章节博主为大家介绍了目前大型互联网项目的系统架构体系,相信大家应该注意到其中很重要的一块知识nginx技术,在本节博主将为大家分享nginx的相关技术以及配置过程。 一、nginx相关概念 ...

em_aaron
今天
1
0
Apache Directory Studio连接Weblogic内置LDAP

OBIEE默认使用Weblogic内置LDAP管理用户及组。 要整理已存在的用户及组,此前办法是导出安全数据,文本编辑器打开认证文件,使用正则表达式获取用户及组的信息。 后来想到直接用Apache Dire...

wffger
今天
2
0
HFS

FS,它是一种上传文件的软件。 专为个人用户所设计的 HTTP 档案系统 - Http File Server,如果您觉得架设 FTP Server 太麻烦,那么这个软件可以提供您更方便的档案传输系统,下载后无须安装,...

garkey
今天
1
0
Java IO类库之BufferedInputStream

一、BufferedInputStream介绍 /** * A <code>BufferedInputStream</code> adds * functionality to another input stream-namely, * the ability to buffer the input and to * sup......

老韭菜
今天
0
0
STM 32 窗口看门狗

http://bbs.elecfans.com/jishu_805708_1_1.html https://blog.csdn.net/a1985831055/article/details/77404131...

whoisliang
昨天
1
0
Dubbo解析(六)-服务调用

当dubbo消费方和提供方都发布和引用完成后,第四步就是消费方调用提供方。 还是以dubbo的DemoService举例 -- 提供方<dubbo:application name="demo-provider"/><dubbo:registry address="z...

青离
昨天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部