BeautifulSoup是一个模块,该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后便可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单。

  1. from bs4 import BeautifulSoup
  2.  
  3. html_doc = """
  4. <html><head><title>The Dormouse's story</title></head>
  5. <body>
  6. asdf
  7. <div class="title">
  8. <b>The Dormouse's story总共</b>
  9. <h1>f</h1>
  10. </div>
  11. <div class="story">Once upon a time there were three little sisters; and their names were
  12. <a class="sister0" id="link1">Els<span>f</span>ie</a>,
  13. <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
  14. <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
  15. and they lived at the bottom of a well.</div>
  16. ad<br/>sf
  17. <p class="story">...</p>
  18. </body>
  19. </html>
  20. """
  21.  
  22. soup = BeautifulSoup(html_doc, features="lxml")
  23. # 找到第一个a标签
  24. tag1 = soup.find(name='a')
  25. # 找到所有的a标签
  26. tag2 = soup.find_all(name='a')
  27. # 找到id=link2的标签
  28. tag3 = soup.select('#link2')
  29.  
  30. 简单示例

1. name,标签名称

  1. 1 # tag = soup.find('a')
  2. 2 # name = tag.name # 获取
  3. 3 # print(name)
  4. 4 # tag.name = 'span' # 设置
  5. 5 # print(soup)

2. attr,标签属性

  1. 1 # tag = soup.find('a')
  2. 2 # attrs = tag.attrs # 获取
  3. 3 # print(attrs)
  4. 4 # tag.attrs = {'ik':123} # 设置
  5. 5 # tag.attrs['id'] = 'iiiii' # 设置
  6. 6 # print(soup)

3. children,所有子标签

  1. 1 # body = soup.find('body')
  2. 2 # v = body.children

4. descendants,所有子子孙孙标签

  1. 1 # body = soup.find('body')
  2. 2 # v = body.descendants

5. clear,将标签的所有子标签全部清空(保留标签名)

  1. 1 # tag = soup.find('body')
  2. 2 # tag.clear()
  3. 3 # print(soup)

6. decompose,递归的删除所有的标签

  1. 1 # body = soup.find('body')
  2. 2 # body.decompose()
  3. 3 # print(soup)

7. extract,递归的删除所有的标签,并获取删除的标签

  1. 1 # body = soup.find('body')
  2. 2 # v = body.extract()
  3. 3 # print(soup)

8. decode,转换为字符串(含当前标签);decode_contents(不含当前标签)

  1. 1 # body = soup.find('body')
  2. 2 # v = body.decode()
  3. 3 # v = body.decode_contents()
  4. 4 # print(v)

9. encode,转换为字节(含当前标签);encode_contents(不含当前标签)

  1. 1 # body = soup.find('body')
  2. 2 # v = body.encode()
  3. 3 # v = body.encode_contents()
  4. 4 # print(v)

10. find,获取匹配的第一个标签

  1. 1 # tag = soup.find('a')
  2. 2 # print(tag)
  3. 3 # tag = soup.find(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
  4. 4 # tag = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
  5. 5 # print(tag)

11. find_all,获取匹配的所有标签

  1. 1 # tags = soup.find_all('a')
  2. 2 # print(tags)
  3. 3
  4. 4 # tags = soup.find_all('a',limit=1)
  5. 5 # print(tags)
  6. 6
  7. 7 # tags = soup.find_all(name='a', attrs={'class': 'sister'}, recursive=True, text='Lacie')
  8. 8 # # tags = soup.find(name='a', class_='sister', recursive=True, text='Lacie')
  9. 9 # print(tags)
  10. 10
  11. 11
  12. 12 # ####### 列表 #######
  13. 13 # v = soup.find_all(name=['a','div'])
  14. 14 # print(v)
  15. 15
  16. 16 # v = soup.find_all(class_=['sister0', 'sister'])
  17. 17 # print(v)
  18. 18
  19. 19 # v = soup.find_all(text=['Tillie'])
  20. 20 # print(v, type(v[0]))
  21. 21
  22. 22
  23. 23 # v = soup.find_all(id=['link1','link2'])
  24. 24 # print(v)
  25. 25
  26. 26 # v = soup.find_all(href=['link1','link2'])
  27. 27 # print(v)
  28. 28
  29. 29 # ####### 正则 #######
  30. 30 import re
  31. 31 # rep = re.compile('p')
  32. 32 # rep = re.compile('^p')
  33. 33 # v = soup.find_all(name=rep)
  34. 34 # print(v)
  35. 35
  36. 36 # rep = re.compile('sister.*')
  37. 37 # v = soup.find_all(class_=rep)
  38. 38 # print(v)
  39. 39
  40. 40 # rep = re.compile('http://www.oldboy.com/static/.*')
  41. 41 # v = soup.find_all(href=rep)
  42. 42 # print(v)
  43. 43
  44. 44 # ####### 方法筛选 #######
  45. 45 # def func(tag):
  46. 46 # return tag.has_attr('class') and tag.has_attr('id')
  47. 47 # v = soup.find_all(name=func)
  48. 48 # print(v)
  49. 49
  50. 50
  51. 51 # ## get,获取标签属性
  52. 52 # tag = soup.find('a')
  53. 53 # v = tag.get('id')
  54. 54 # print(v)

12. has_attr,检查标签是否具有该属性

  1. 1 # tag = soup.find('a')
  2. 2 # v = tag.has_attr('id')
  3. 3 # print(v)

13. get_text,获取标签内部文本内容

  1. 1 # tag = soup.find('a')
  2. 2 # v = tag.get_text('id')
  3. 3 # print(v)

14. index,检查标签在某标签中的索引位置

  1. 1 # tag = soup.find('body')
  2. 2 # v = tag.index(tag.find('div'))
  3. 3 # print(v)
  4. 4
  5. 5 # tag = soup.find('body')
  6. 6 # for i,v in enumerate(tag):
  7. 7 # print(i,v)

15. is_empty_element,是否是空标签(是否可以是空)或者自闭合标签,

判断是否是如下标签:'br' , 'hr', 'input', 'img', 'meta','spacer', 'link', 'frame', 'base'

  1. 1 # tag = soup.find('br')
  2. 2 # v = tag.is_empty_element
  3. 3 # print(v)

16. 当前的关联标签

  1. 1 # soup.next
  2. 2 # soup.next_element
  3. 3 # soup.next_elements
  4. 4 # soup.next_sibling
  5. 5 # soup.next_siblings
  6. 6
  7. 7 #
  8. 8 # tag.previous
  9. 9 # tag.previous_element
  10. 10 # tag.previous_elements
  11. 11 # tag.previous_sibling
  12. 12 # tag.previous_siblings
  13. 13
  14. 14 #
  15. 15 # tag.parent
  16. 16 # tag.parents

17. 查找某标签的关联标签

  1. 1 # tag.find_next(...)
  2. 2 # tag.find_all_next(...)
  3. 3 # tag.find_next_sibling(...)
  4. 4 # tag.find_next_siblings(...)
  5. 5
  6. 6 # tag.find_previous(...)
  7. 7 # tag.find_all_previous(...)
  8. 8 # tag.find_previous_sibling(...)
  9. 9 # tag.find_previous_siblings(...)
  10. 10
  11. 11 # tag.find_parent(...)
  12. 12 # tag.find_parents(...)
  13. 13
  14. 14 # 参数同find_all

18. select,select_one, CSS选择器

  1. 1 soup.select("title")
  2. 2
  3. 3 soup.select("p nth-of-type(3)")
  4. 4
  5. 5 soup.select("body a")
  6. 6
  7. 7 soup.select("html head title")
  8. 8
  9. 9 tag = soup.select("span,a")
  10. 10
  11. 11 soup.select("head > title")
  12. 12
  13. 13 soup.select("p > a")
  14. 14
  15. 15 soup.select("p > a:nth-of-type(2)")
  16. 16
  17. 17 soup.select("p > #link1")
  18. 18
  19. 19 soup.select("body > a")
  20. 20
  21. 21 soup.select("#link1 ~ .sister")
  22. 22
  23. 23 soup.select("#link1 + .sister")
  24. 24
  25. 25 soup.select(".sister")
  26. 26
  27. 27 soup.select("[class~=sister]")
  28. 28
  29. 29 soup.select("#link1")
  30. 30
  31. 31 soup.select("a#link2")
  32. 32
  33. 33 soup.select('a[href]')
  34. 34
  35. 35 soup.select('a[href="http://example.com/elsie"]')
  36. 36
  37. 37 soup.select('a[href^="http://example.com/"]')
  38. 38
  39. 39 soup.select('a[href$="tillie"]')
  40. 40
  41. 41 soup.select('a[href*=".com/el"]')
  42. 42
  43. 43
  44. 44 from bs4.element import Tag
  45. 45
  46. 46 def default_candidate_generator(tag):
  47. 47 for child in tag.descendants:
  48. 48 if not isinstance(child, Tag):
  49. 49 continue
  50. 50 if not child.has_attr('href'):
  51. 51 continue
  52. 52 yield child
  53. 53
  54. 54 tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator)
  55. 55 print(type(tags), tags)
  56. 56
  57. 57 from bs4.element import Tag
  58. 58 def default_candidate_generator(tag):
  59. 59 for child in tag.descendants:
  60. 60 if not isinstance(child, Tag):
  61. 61 continue
  62. 62 if not child.has_attr('href'):
  63. 63 continue
  64. 64 yield child
  65. 65
  66. 66 tags = soup.find('body').select("a", _candidate_generator=default_candidate_generator, limit=1)
  67. 67 print(type(tags), tags)

19. 标签的内容

  1. 1 # tag = soup.find('span')
  2. 2 # print(tag.string) # 获取
  3. 3 # tag.string = 'new content' # 设置
  4. 4 # print(soup)
  5. 5
  6. 6 # tag = soup.find('body')
  7. 7 # print(tag.string)
  8. 8 # tag.string = 'xxx'
  9. 9 # print(soup)
  10. 10
  11. 11 # tag = soup.find('body')
  12. 12 # v = tag.stripped_strings # 递归内部获取所有标签的文本
  13. 13 # print(v)

20.append在当前标签内部追加一个标签

  1. 1 # tag = soup.find('body')
  2. 2 # tag.append(soup.find('a'))
  3. 3 # print(soup)
  4. 4 #
  5. 5 # from bs4.element import Tag
  6. 6 # obj = Tag(name='i',attrs={'id': 'it'})
  7. 7 # obj.string = '我是一个新来的'
  8. 8 # tag = soup.find('body')
  9. 9 # tag.append(obj)
  10. 10 # print(soup)

21.insert在当前标签内部指定位置插入一个标签

  1. 1 # from bs4.element import Tag
  2. 2 # obj = Tag(name='i', attrs={'id': 'it'})
  3. 3 # obj.string = '我是一个新来的'
  4. 4 # tag = soup.find('body')
  5. 5 # tag.insert(2, obj)
  6. 6 # print(soup)

22. insert_after,insert_before 在当前标签后面或前面插入

  1. 1 # from bs4.element import Tag
  2. 2 # obj = Tag(name='i', attrs={'id': 'it'})
  3. 3 # obj.string = '我是一个新来的'
  4. 4 # tag = soup.find('body')
  5. 5 # # tag.insert_before(obj)
  6. 6 # tag.insert_after(obj)
  7. 7 # print(soup)

23. replace_with 在当前标签替换为指定标签

  1. 1 # from bs4.element import Tag
  2. 2 # obj = Tag(name='i', attrs={'id': 'it'})
  3. 3 # obj.string = '我是一个新来的'
  4. 4 # tag = soup.find('div')
  5. 5 # tag.replace_with(obj)
  6. 6 # print(soup)

24. 创建标签之间的关系(但不会改变标签的位置)

  1. 1 # tag = soup.find('div')
  2. 2 # a = soup.find('a')
  3. 3 # tag.setup(previous_sibling=a)
  4. 4 # print(tag.previous_sibling)

25. wrap,将指定标签把当前标签包裹起来

  1. 1 # from bs4.element import Tag
  2. 2 # obj1 = Tag(name='div', attrs={'id': 'it'})
  3. 3 # obj1.string = '我是一个新来的'
  4. 4 #
  5. 5 # tag = soup.find('a')
  6. 6 # v = tag.wrap(obj1)
  7. 7 # print(soup)
  8. 8
  9. 9 # tag = soup.find('a')
  10. 10 # v = tag.wrap(soup.find('p'))
  11. 11 # print(soup)

26. unwrap,去掉当前标签,将保留其包裹的标签

  1. 1 # tag = soup.find('a')
  2. 2 # v = tag.unwrap()
  3. 3 # print(soup)

爬虫之BeautifulSoup的更多相关文章

  1. 爬虫模块BeautifulSoup

    中文文档:https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.zh.html# 1.1      安装BeautifulSoup模块 ...

  2. 使用Python爬虫库BeautifulSoup遍历文档树并对标签进行操作详解(新手必学)

    为大家介绍下Python爬虫库BeautifulSoup遍历文档树并对标签进行操作的详细方法与函数下面就是使用Python爬虫库BeautifulSoup对文档树进行遍历并对标签进行操作的实例,都是最 ...

  3. Python 爬虫—— requests BeautifulSoup

    本文记录下用来爬虫主要使用的两个库.第一个是requests,用这个库能很方便的下载网页,不用标准库里面各种urllib:第二个BeautifulSoup用来解析网页,不然自己用正则的话很烦. req ...

  4. python爬虫之BeautifulSoup

    爬虫有时候写正则表达式会有假死现象 就是正则表达式一直在进行死循环查找 例如:https://social.msdn.microsoft.com/forums/azure/en-us/3f4390ac ...

  5. Python开发爬虫之BeautifulSoup解析网页篇:爬取安居客网站上北京二手房数据

    目标:爬取安居客网站上前10页北京二手房的数据,包括二手房源的名称.价格.几室几厅.大小.建造年份.联系人.地址.标签等. 网址为:https://beijing.anjuke.com/sale/ B ...

  6. web爬虫,BeautifulSoup

    BeautifulSoup 该模块用于接收一个HTML或XML字符串,然后将其进行格式化,之后遍可以使用他提供的方法进行快速查找指定元素,从而使得在HTML或XML中查找指定元素变得简单. 1 2 3 ...

  7. python 爬虫 requests+BeautifulSoup 爬取巨潮资讯公司概况代码实例

    第一次写一个算是比较完整的爬虫,自我感觉极差啊,代码low,效率差,也没有保存到本地文件或者数据库,强行使用了一波多线程导致数据顺序发生了变化... 贴在这里,引以为戒吧. # -*- coding: ...

  8. Python爬虫——用BeautifulSoup、python-docx爬取廖雪峰大大的教程为word文档

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com 廖雪峰大大贡献的教程写的不错,写了个爬虫把教程保存为word文件,供大家方便下载学习:http://p ...

  9. python3: 爬虫---- urllib, beautifulsoup

    最近晚上学习爬虫,首先从基本的开始: python3 将urllib,urllib2集成到urllib中了, urllib可以对指定的网页进行请求下载,  beautifulsoup 可以从杂乱的ht ...

  10. 【Python爬虫】BeautifulSoup网页解析库

    BeautifulSoup 网页解析库 阅读目录 初识Beautiful Soup Beautiful Soup库的4种解析器 Beautiful Soup类的基本元素 基本使用 标签选择器 节点操作 ...

随机推荐

  1. PHPExcel正确读取excel表格时间单元格(转载)

    error_reporting(E_ALL); date_default_timezone_set('Asia/shanghai'); /** PHPExcel_IOFactory */ requir ...

  2. db2

    关于3种导入导出操作进行简单的介绍:export:导出数据,支持IXF,DEL或WSFimport:导入数据,可以向表中导入数据,支持上面提到的4种文件类型.    load:导入数据,功能和impo ...

  3. 如果返回结构体类型变量(named return value optimisation,NRVO)

    貌似这是一个非常愚蠢的问题,因为对于具有良好素质的程序员而言,在C中函数返回类型为结构体类型是不是有点不合格,干嘛不用指针做传入传出呢? 测试环境:Linux IOS 3.2.0-45-generic ...

  4. linux数据盘分区以及格式化

    首先切换到root账户下  sudo -i 手动格式化 请根据以下步骤对数据盘进行分区以及格式化,并挂载分区使数据盘可用. 注:执行以下命令时,请注意修改数据盘符,可以使用”fdisk -l”查看盘符 ...

  5. 【VR】Leap Motion 官网文档 FingerModel (手指模型)

    前言: 感谢关注和支持这个Leap Motion系列翻译的朋友们,非常抱歉因为工作原因非常久没有更新,今后这个翻译还会继续(除非官方直接给出中文文档).本篇献给大家的是 <FingerModel ...

  6. python3.0与python2.0有哪些不同

    python3的语法跟python2哪里变了. 1. python3中1/2终于等于0.5 了 2. print "Hello World"变成了print("Hello ...

  7. Python zmail 模块

    zmail 是 python3 用来收发邮件的一个模块,用法参考: https://mp.weixin.qq.com/s?__biz=MzAxMjUyNDQ5OA==&mid=26535559 ...

  8. MongoDB 用户角色

    Read:允许用户读取指定数据库 readWrite:允许用户读写指定数据库 dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建.删除,查看统计或访问system.profile user ...

  9. iOS @synthesize var = _var 变量前置下划线解释

    本文转载至 http://blog.csdn.net/ztp800201/article/details/9231617  前置下划线是一种为了帮助区分实例变量和访问方法的约定.对于编译器来说它只是一 ...

  10. Swift-属性、方法、下标

    存储属性和计算属性 类.结构和枚举都能够定义存储属性和计算属性.其中存储属性就是常见的形式,又分为变量属性和常量属性,如: struct Point { var x = 0.0, y = 0.0 } ...