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

官方文档地址:http://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html

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

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

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

安装

linux下可以执行

[plain] view plaincopy

  1. apt-get install python-bs4

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

[html] view plaincopy

  1. easy_install beautifulsoup4
  2. pip install beautifulsoup4

使用简介

下面说一下BeautifulSoup 的使用。

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

1:获取指定tag的内容。

[plain] view plaincopy

  1. <p>hello, watsy</p><br><p>hello, beautiful soup.</p>

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

[html] view plaincopy

  1. <a href="http://blog.csdn.net/watsy">watsy‘s blog</a>

3:如何获取,就需要用到查找方法。

使用示例采用官方

[html] view plaincopy

  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. <p class="story">Once upon a time there were three little sisters; and their names were
  6. <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
  7. <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
  8. <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
  9. and they lived at the bottom of a well.</p>
  10. <p class="story">...</p>
  11. """

格式化输出。

[html] view plaincopy

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

获取指定tag的内容

[html] view plaincopy

  1. soup.title
  2. # <title>The Dormouse‘s story</title>
  3. soup.title.name
  4. # u‘title‘
  5. soup.title.string
  6. # u‘The Dormouse‘s story‘
  7. soup.title.parent.name
  8. # u‘head‘
  9. soup.p
  10. # <p class="title"><b>The Dormouse‘s story</b></p>
  11. soup.a
  12. # <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 plaincopy

  1. soup.p[‘class‘]
  2. # u‘title‘

获取属性。方法是

soup.tag[‘属性名称‘]

[html] view plaincopy

  1. <a href="http://blog.csdn.net/watsy">watsy‘s blog</a>

常见的应该是如上的提取联接。

代码是

[html] view plaincopy

  1. soup.a[‘href‘]

相当easy吧。

查找与判断

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

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

[html] view plaincopy

  1. def find_all(self, name=None, attrs={}, recursive=True, text=None,
  2. limit=None, **kwargs):

看参数。

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

举例使用。

[html] view plaincopy

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

获取内容和字符串

获取tag的字符串

[html] view plaincopy

  1. title_tag.string
  2. # u‘The Dormouse‘s story‘

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

使用strings属性会返回soup的构造1个迭代器,迭代tag对象下面的所有文本内容

[html] view plaincopy

  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 plaincopy

  1. head_tag = soup.head
  2. head_tag
  3. # <head><title>The Dormouse‘s story</title></head>
  4. head_tag.contents
  5. [<title>The Dormouse‘s story</title>]
  6. title_tag = head_tag.contents[0]
  7. title_tag
  8. # <title>The Dormouse‘s story</title>
  9. title_tag.contents
  10. # [u‘The Dormouse‘s story‘]

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

总结

其实使用起主要是

[html] view plaincopy

  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

转自   http://blog.csdn.net/watsy/article/details/14161201

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

时间: 2024-10-11 12:39:36

(转)python下很帅气的爬虫包 - Beautiful Soup 示例的相关文章

python下的复杂网络编程包networkx的安装及使用

由于py3.x与工具包的兼容问题,这里采用py2.7 1.python下的复杂网络编程包networkx的使用: http://blog.sina.com.cn/s/blog_720448d301018px7.html 处理1里面提到的那四个安装包还要: 2.需要安装 setuptools: http://wenku.baidu.com/link?url=XL2qKVZbDPh-XocJW7OVZmacM4Tio5YhCyu0Uw-E7CjhiXRrhSWI4xheERjEVC3olCZ8muN

爬虫之Beautiful Soup

了解Beautiful Soup 中文文档: Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式 安装 beautifulsoup4 >: pip install beautifulsoup4 解析器 Beautiful Soup支持Python标准库中的HTML解析器,还支持一些第三方的解析器,其中一个是 lxml .根据操作系统不同,可以选择下列方法来安装lxml: $ apt-get i

python下用selenium的webdriver包如何在执行完点击下一页后没有获得下一页新打开页面的html源代码

问题描述: 新打开的页面url不变,只是网页内容变了,然后使用drive.page_source得到的都是第一页的html代码,并不是当前页面的html代码. 1.  原因:webdriver仍默认在原页面下获取标签等信息: 解决方法:采用切换页面句柄的方式解决: 2.  原因:缺少time.sleep(1),如果短了就无法正常获取数据,所以检查适当位置是否有停留 def get_info(num): driver.get(url) driver.implicitly_wait(10) # 隐式

Python网络爬虫 - 2. Beautiful Soup小试牛刀

目标: 我们解析百度首页的logo bs_baidu_logo.py from urllib.request import urlopen from bs4 import BeautifulSoup html = urlopen("http://www.baidu.com") bsObj = BeautifulSoup(html.read(), "html.parser") print(bsObj.img) 运行结果: <img height="12

爬虫5:Beautiful Soup的css选择器

学习于:http://cuiqingcai.com/1319.html 用到的方法是 soup.select(),返回类型是 list,用 get_text() 方法来获取它的内容 (1)通过标签名查找 print soup.select('title')  print soup.select('a') print soup.select('b') (2)通过类名查找 print soup.select('.sister') (3)通过 id 名查找 print soup.select('#li

Python的html和xml解析库Beautiful Soup

网站:http://www.crummy.com/software/BeautifulSoup/ 版权声明:本文博主原创文章,博客,未经同意不得转载.

【爬虫】beautiful soup笔记(待填坑)

Beautiful Soup是一个第三方的网页解析的模块.其遵循的接口为Document Tree,将网页解析成为一个树形结构. 其使用步骤如下: 1.创建对象:根据网页的文档字符串 2.搜索节点:名称.属性.文字. 3.处理节点: BeautifulSoup(文档字符串, 'html.parser' 解析器,from_encoding='utf8') find_all(名称,属性,文字):可以传入字符串 也可以传入正则表达式. node.name 名称 node['href'] 属性 node

python爬虫之解析库Beautiful Soup

Beautiful Soup4操作 为何要用Beautiful Soup Beautiful Soup是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式, 是一个标签的形式,来进行查找的,有点像jquery的形式.提升效率,我们在进行爬虫开发的时候,进程会用到正则来进行查找过滤的操作,纯手动会及其浪费时间. Beautiful Soup示例摘自官网 html_doc = """ <html>

Python下科学计算包numpy和SciPy的安装

转载自:http://blog.sina.com.cn/s/blog_62dfdc740101aoo6.html Python下大多数工具包的安装都很简单,只需要执行 “python setup.py install”命令即可.然而,由于SciPy和numpy这两个科学计算包的依赖关系较多,安装过程较为复杂.网上教程较为混乱,而且照着做基本都不能用.在仔细研读各个包里的README和INSTALL之后,终于安装成功.现记录如下. 系统环境: OS:RedHat5 Python版本:Python2