BeautifulSoup 模块详解


  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')

安装

  1. pip3 install beautifulsoup4

使用案例

  1. from bs4 import BeautifulSoup
  2.  
  3. html_doc = """
  4. <html><head><title>The Dormouse's story</title></head>
  5. <body>
  6. ...
  7. </body>
  8. </html>
  9. """
  10.  
  11. soup = BeautifulSoup(html_doc, features="lxml")

各个属性方法介绍

name,获取标签名称

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

attr,标签属性

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

children,所有子标签

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

descendants,所有子子孙孙标签

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

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

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

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

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

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

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

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

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

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

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

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

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

find_all,获取匹配的所有标签

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

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

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

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

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

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

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

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

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

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

当前的关联标签

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

查找某标签的关联标签

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

select,select_one, CSS选择器

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

标签的内容

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

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

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

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

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

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

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

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

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

创建标签之间的关系  

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

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

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

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

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

更多参数官方:http://beautifulsoup.readthedocs.io/zh_CN/v4.4.0/

本博文参考自:http://www.cnblogs.com/wupeiqi/articles/6283017.html

  

BeautifulSoup 模块详解的更多相关文章

  1. Python中操作mysql的pymysql模块详解

    Python中操作mysql的pymysql模块详解 前言 pymsql是Python中操作MySQL的模块,其使用方法和MySQLdb几乎相同.但目前pymysql支持python3.x而后者不支持 ...

  2. python之OS模块详解

    python之OS模块详解 ^_^,步入第二个模块世界----->OS 常见函数列表 os.sep:取代操作系统特定的路径分隔符 os.name:指示你正在使用的工作平台.比如对于Windows ...

  3. python之sys模块详解

    python之sys模块详解 sys模块功能多,我们这里介绍一些比较实用的功能,相信你会喜欢的,和我一起走进python的模块吧! sys模块的常见函数列表 sys.argv: 实现从程序外部向程序传 ...

  4. python中threading模块详解(一)

    python中threading模块详解(一) 来源 http://blog.chinaunix.net/uid-27571599-id-3484048.html threading提供了一个比thr ...

  5. python time 模块详解

    Python中time模块详解 发表于2011年5月5日 12:58 a.m.    位于分类我爱Python 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括: ...

  6. python time模块详解

    python time模块详解 转自:http://blog.csdn.net/kiki113/article/details/4033017 python 的内嵌time模板翻译及说明  一.简介 ...

  7. 小白的Python之路 day5 time,datatime模块详解

    一.模块的分类 可以分成三大类: 1.标准库 2.开源模块 3.自定义模块 二.标准库模块详解 1.time与datetime 在Python中,通常有这几种方式来表示时间:1)时间戳 2)格式化的时 ...

  8. 小白的Python之路 day5 random模块和string模块详解

    random模块详解 一.概述 首先我们看到这个单词是随机的意思,他在python中的主要用于一些随机数,或者需要写一些随机数的代码,下面我们就来整理他的一些用法 二.常用方法 1. random.r ...

  9. Python中time模块详解

    Python中time模块详解 在平常的代码中,我们常常需要与时间打交道.在Python中,与时间处理有关的模块就包括:time,datetime以及calendar.这篇文章,主要讲解time模块. ...

随机推荐

  1. conda常用命令

    1. conda基本命令 检查Anaconda是否成功安装 conda --version 检测目前安装了哪些环境 conda info --envs 检查目前有哪些版本的python可以安装: co ...

  2. Express web框架

    哈哈,还是Node.JS哦 现在我们来看看位Node.JS些的Express webkuangjia 一. 安装express npm install express -g --save npm in ...

  3. import Tkinter error, no module named tkinter: "Python may not be configured for Tk”

    install required devel module in your linux: yum install tk-devel yum install tcl-devel then,reconfi ...

  4. c++基础:之封装

         原创: 零灵柒 C/C++的编程教室 2月4日 什么是类 C++是什么?C++设计之初就是class with c,所以简单点说,C++就是带类的C,那么什么是类? 类,简单点说就是类型,在 ...

  5. PO模型

    大神绕道而行,自我小白的笔记,仅此 一.创建文件夹,创建xxx.ini文件用来存放界面的定位元素,用 [界面_element]-->界面, 来划分界面界面元素,维护方便.定位元素的格式:  us ...

  6. gitlab数据迁移至其他gitlb服务器上

    需求: A : 待迁移服务器,上边存有数据 B:接收项目得服务器,本身存在数据 验证方案: 一,搭建gitlab8.15.2 OS:rhel7.4 yum install policycoreutil ...

  7. hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection

      hadoop 遇到java.net.ConnectException: to 0.0.0.0:10020 failed on connection   这个问题一般是在hadoop2.x版本里会出 ...

  8. UVa-116 Unidirectional TSP 单向旅行商

    题目 https://vjudge.net/problem/uva-116 分析 设d[i][j]为从(i,j)到最后一列的最小开销,则d[i][j]=a[i][j]+max(d[i+1][j+1], ...

  9. MOG插件(葡萄牙语,略作翻译)

    这次记录下MOG大神的插件,自从我发现了这个插件,似乎开启了一个新世界诶~~~ 网址 https://atelierrgss.wordpress.com 1. MOG_YuruYuri.js CARA ...

  10. C语言阐述进程和线程的区别

    [cpp]view plain copy /* 每一个程序相当于一个进程,而一个进程之中可以有多个线程 */ #define _CRT_SECURE_NO_WARNINGS #include<s ...