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  

Python爬虫实战视频教程

-
  • 1970年01月01日 08:00

python beautifulsoap的安装

Beautiful Soup 是用Python写的一个HTML/XML的解析器,它可以很好的处理不规范标记并生成剖析树(parse tree)。 (1)windows环境下安装 beautifu...
  • qq_28093585
  • qq_28093585
  • 2017-03-10 00:06:42
  • 896

BeautifulSoap 安装和使用

虽然安装了pip和easy_install,但是通过它们没有安装成功BeautifulSoap,只好手动安装。 步骤: 下载地址:http://www.crummy.com/software/Be...
  • u012477826
  • u012477826
  • 2015-12-04 14:34:30
  • 1364

从零开始学网络爬虫之BeautifulSoap

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

SOAP-Simple Object Access Protocol(简单对象访问协议)

原文链接   作者: Jakob Jenkov  译者:赵亮 SOAP是Simple Object Access Protocol(简单对象传输协议)的缩写。SOAP消息是基于XML格式进行传输的,...
  • wanglha
  • wanglha
  • 2016-05-13 13:37:42
  • 593

使用BeautifulSoap爬取安智网的所有应用信息

开发工具: python版本:python2.7 开发工具:Eclipse 开发需求: 1、爬取安智网下的app应用信息:应用分类、应用名称、下载次数、上线时间、包大小、支持系统版本...
  • xianjie0318
  • xianjie0318
  • 2018-01-16 11:13:42
  • 89

JMeter做Rest或SOAP测试

 What can I do with it? Apache JMeter may be used to test performance both on static and dynamic...
  • cxzhq2002
  • cxzhq2002
  • 2016-08-23 15:59:23
  • 280

《Python编程》笔记(一)

可以使用pickle模块将对象持久化:它会将内存中的Python对象转换成序列化的字节流,可以持久化几乎各种类型的对象。...
  • xE8551CCB
  • xE8551CCB
  • 2016-08-11 16:28:51
  • 595

阿里巴巴java规范检测值得注意的项总结

1.long或者Long初始赋值时,必须使用大写的L,不能是小写的l,小写容易跟数字1混淆,造成误解2.在if/else for while/do语句中必须使用大括号,即使只有一行代码3.在使用正则表...
  • github_37610197
  • github_37610197
  • 2017-10-18 15:45:45
  • 250

关于WSDL中soapenc:Array的使用问题

当我们用web service对外提供接口服务的时候,可能很多接口会返回复杂类型,比如数组; 在此次利用.Net下面WCF和我们ASSP API【Alisoft SaaS Platform API】进...
  • sfdev
  • sfdev
  • 2008-04-22 14:12:00
  • 8476
收藏助手
不良信息举报
您举报文章:beautiful soap simple examples
举报原因:
原因补充:

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