beautiful soap simple examples

转载 2016年12月08日 18:02:15
 

python下很帅气的爬虫包 - Beautiful Soup 示例 

 34879人阅读 评论(3) 收藏 举报
 分类:
 

目录(?)[+]

先发一下官方文档地址。http://www.crummy.com/software/BeautifulSoup/bs4/doc/

建议有时间可以看一下Python包的文档。


Beautiful Soup 相比其他的html解析有个非常重要的优势。html会被拆解为对象处理。全篇转化为字典和数组。

相比正则解析的爬虫,省略了学习正则的高成本。

相比xpath爬虫的解析,同样节约学习时间成本。虽然xpath已经简单点了。(爬虫框架Scrapy就是使用xpath)


安装

linux下可以执行

[plain] view plain copy
  1. apt-get install python-bs4  

也可以用python的安装包工具来安装

[html] view plain copy
  1. easy_install beautifulsoup4  
  2.   
  3. pip install beautifulsoup4  


使用简介

下面说一下BeautifulSoup 的使用。

解析html需要提取数据。其实主要有几点

1:获取指定tag的内容。

[plain] view plain copy
  1. <p>hello, watsy</p><br><p>hello, beautiful soup.</p>  

2:获取指定tag下的属性。

[html] view plain copy
  1. <a href="http://blog.csdn.net/watsy">watsy's blog</a>  
3:如何获取,就需要用到查找方法。


使用示例采用官方

[html] view plain copy
  1. html_doc = """  
  2. <html><head><title>The Dormouse's story</title></head>  
  3. <body>  
  4. <p class="title"><b>The Dormouse's story</b></p>  
  5.   
  6. <p class="story">Once upon a time there were three little sisters; and their names were  
  7. <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,  
  8. <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and  
  9. <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;  
  10. and they lived at the bottom of a well.</p>  
  11.   
  12. <p class="story">...</p>  
  13. """  
格式化输出。
[html] view plain copy
  1. from bs4 import BeautifulSoup  
  2. soup = BeautifulSoup(html_doc)  
  3.   
  4. print(soup.prettify())  
  5. <html>  
  6. #  <head>  
  7. #   <title>  
  8. #    The Dormouse's story  
  9. #   </title>  
  10. #  </head>  
  11. #  <body>  
  12. #   <p class="title">  
  13. #    <b>  
  14. #     The Dormouse's story  
  15. #    </b>  
  16. #   </p>  
  17. #   <p class="story">  
  18. #    Once upon a time there were three little sisters; and their names were  
  19. #    <a class="sister" href="http://example.com/elsie" id="link1">  
  20. #     Elsie  
  21. #    </a>  
  22. #    ,  
  23. #    <a class="sister" href="http://example.com/lacie" id="link2">  
  24. #     Lacie  
  25. #    </a>  
  26. #    and  
  27. #    <a class="sister" href="http://example.com/tillie" id="link2">  
  28. #     Tillie  
  29. #    </a>  
  30. #    ; and they lived at the bottom of a well.  
  31. #   </p>  
  32. #   <p class="story">  
  33. #    ...  
  34. #   </p>  
  35. #  </body>  
  36. </html>  


获取指定tag的内容

[html] view plain copy
  1. soup.title  
  2. <title>The Dormouse's story</title>  
  3.   
  4. soup.title.name  
  5. # u'title'  
  6.   
  7. soup.title.string  
  8. # u'The Dormouse's story'  
  9.   
  10. soup.title.parent.name  
  11. # u'head'  
  12.   
  13. soup.p  
  14. <p class="title"><b>The Dormouse's story</b></p>  
  15.   
  16. soup.a  
  17. <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>  

上面示例给出了4个方面

1:获取tag

soup.title

2:获取tag名称

soup.title.name

3:获取title tag的内容

soup.title.string

4:获取title的父节点tag的名称

soup.title.parent.name


怎么样,非常对象化的使用吧。


提取tag属性

下面要说一下如何提取href等属性。

[html] view plain copy
  1. soup.p['class']  
  2. # u'title'  

获取属性。方法是

soup.tag['属性名称']

[html] view plain copy
  1. <a href="http://blog.csdn.net/watsy">watsy's blog</a>  
常见的应该是如上的提取联接。

代码是

[html] view plain copy
  1. soup.a['href']  
相当easy吧。


查找与判断

接下来进入重要部分。全文搜索查找提取.

soup提供find与find_all用来查找。其中find在内部是调用了find_all来实现的。因此只说下find_all

[html] view plain copy
  1. def find_all(self, name=Noneattrs={}, recursive=Truetext=None,  
  2.                  limit=None, **kwargs):  

看参数。

第一个是tag的名称,第二个是属性。第3个选择递归,text是判断内容。limit是提取数量限制。**kwargs 就是字典传递了。。

举例使用。

[html] view plain copy
  1. tag名称  
  2. soup.find_all('b')  
  3. # [<b>The Dormouse's story</b>]  
  4.   
  5. 正则参数  
  6. import re  
  7. for tag in soup.find_all(re.compile("^b")):  
  8.     print(tag.name)  
  9. # body  
  10. # b  
  11.   
  12. for tag in soup.find_all(re.compile("t")):  
  13.     print(tag.name)  
  14. # html  
  15. # title  
  16.   
  17. 列表  
  18. soup.find_all(["a", "b"])  
  19. # [<b>The Dormouse's story</b>,  
  20. #  <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,  
  21. #  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,  
  22. #  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]  
  23.   
  24. 函数调用  
  25. def has_class_but_no_id(tag):  
  26.     return tag.has_attr('class') and not tag.has_attr('id')  
  27.   
  28. soup.find_all(has_class_but_no_id)  
  29. # [<p class="title"><b>The Dormouse's story</b></p>,  
  30. #  <p class="story">Once upon a time there were...</p>,  
  31. #  <p class="story">...</p>]  
  32.   
  33. tag的名称和属性查找  
  34. soup.find_all("p", "title")  
  35. # [<p class="title"><b>The Dormouse's story</b></p>]  
  36.   
  37. tag过滤  
  38. soup.find_all("a")  
  39. # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>,  
  40. #  <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>,  
  41. #  <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]  
  42.   
  43. tag属性过滤  
  44. soup.find_all(id="link2")  
  45. # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]  
  46.   
  47. text正则过滤  
  48. import re  
  49. soup.find(text=re.compile("sisters"))  
  50. # u'Once upon a time there were three little sisters; and their names were\n'  

获取内容和字符串

获取tag的字符串
[html] view plain copy
  1. title_tag.string  
  2. # u'The Dormouse's story'  

注意在实际使用中应该使用 unicode(title_tag.string)来转换为纯粹的string对象

使用strings属性会返回soup的构造1个迭代器,迭代tag对象下面的所有文本内容
[html] view plain copy
  1. for string in soup.strings:  
  2.     print(repr(string))  
  3. # u"The Dormouse's story"  
  4. # u'\n\n'  
  5. # u"The Dormouse's story"  
  6. # u'\n\n'  
  7. # u'Once upon a time there were three little sisters; and their names were\n'  
  8. # u'Elsie'  
  9. # u',\n'  
  10. # u'Lacie'  
  11. # u' and\n'  
  12. # u'Tillie'  
  13. # u';\nand they lived at the bottom of a well.'  
  14. # u'\n\n'  
  15. # u'...'  
  16. # u'\n'  



获取内容
.contents会以列表形式返回tag下的节点。
[html] view plain copy
  1. head_tag = soup.head  
  2. head_tag  
  3. <head><title>The Dormouse's story</title></head>  
  4.   
  5. head_tag.contents  
  6. [<title>The Dormouse's story</title>]  
  7.   
  8. title_tag = head_tag.contents[0]  
  9. title_tag  
  10. <title>The Dormouse's story</title>  
  11. title_tag.contents  
  12. # [u'The Dormouse's story']  

想想,应该没有什么其他的了。。其他的也可以看文档学习使用。

总结

其实使用起主要是
[html] view plain copy
  1. soup = BeatifulSoup(data)  
  2. soup.title  
  3. soup.p.['title']  
  4. divs = soup.find_all('div', content='tpc_content')  
  5. divs[0].contents[0].string  

从零开始学网络爬虫之BeautifulSoap

之前我们介绍了正则表达式,可能有的小伙伴也对写正则表达式的用法还不够熟练,没关系,我们还有一个更强大的工具,叫Beautiful Soup,它可以与Requests配合使用,在获得网页源码后进行分析,...
  • lxmanutd
  • lxmanutd
  • 2016年12月08日 08:33
  • 1300

《阿里JAVA编码规范》读后笔记

正所谓脑袋空空,口袋空空,坚持每天学一点东西,坚持每天记录所见所学 :P这两天耐着性子把《阿里JAVA编码规范》看完了,觉得收获良多,先记载下自己的学习笔记,等抽空了再尝试把里面的内容结构化一下方便以...
  • gaoyib6
  • gaoyib6
  • 2017年07月31日 19:36
  • 149

基于Java的webservice创建与soap方式调用

一、创建(服务端) 建立普通类,代码: 浏览器键入http://localhost:8083/HelloWorld 二、调用(客户端) 1、利用SoapUI获取请求报文 创建S...
  • u013258447
  • u013258447
  • 2017年05月09日 11:17
  • 1799

SOAP和RESTful 框架的 简介、对比和区别

SOAP简单对象访问协议(Simple Object Access Protocol,SOAP)是一种基于 XML 的协议,可以和现存的许多因特网协议和格式结合使用,包括超文本传输协议(HTTP),简...
  • caisini_vc
  • caisini_vc
  • 2015年09月15日 12:10
  • 6708

Python爬虫入门之Beautiful Soup的用法

1. Beautiful Soup的简介 简单来说,Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下: Beautiful Soup提供一些简单的、...
  • walter_chan
  • walter_chan
  • 2015年09月12日 15:05
  • 574

C#的Soap调用

想写个远程调用HTTP的功能,考虑用soap。 一:.Net FrameWork2.0 : C#支持了对Soap的调用类的自动生成,象这样:在工程上右键点击“Add Web Reference...
  • trobin
  • trobin
  • 2013年01月31日 09:52
  • 3059

SOAP 比对解释

SOAP2是SOAP的升级版本,提高了短序列比对的运行速度和精度,同时SOAP2的一个重要改进是支持不同长度的读长。 使用步骤: 1.用2bwt-builder对fa文件建立索引 使用方法:2b...
  • zhu_si_tao
  • zhu_si_tao
  • 2017年05月03日 11:19
  • 743

SOAP 1.1与1.2版本区别

转自:http://blog.sina.com.cn/s/blog_5f044a4d0101gzli.html WebService通过HTTP协议完成远程调用: (深入分析) – RP...
  • fengxing11
  • fengxing11
  • 2016年11月01日 12:14
  • 3058

发送http post请求soap服务

要访问的webservice服务说明文档:                    根据城市或地区名称查询获得未来三天内天气情况、现在的天气实况、天气和生活指数           ...
  • hu8471479
  • hu8471479
  • 2013年12月26日 21:59
  • 6101

编译qt5 examples里边的一个brower

首先把对应的两个qt版本下下来,这里悬着的是opengl版本的最新版 http://qt-project.org/downloads 因为下载安装之后得到的是p...
  • zengraoli
  • zengraoli
  • 2013年06月18日 11:16
  • 2390
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:beautiful soap simple examples
举报原因:
原因补充:

(最多只允许输入30个字)