1.安装

pip install beautifulsoup4

2.代码文件中导入

from bs4 import BeautifulSoup

3.

解析器 使用方法 优势 劣势
Python标准库 BeautifulSoup(markup, “html.parser”)
  • Python的内置标准库
  • 执行速度适中
  • 文档容错能力强
  • Python 2.7.3 or 3.2.2)前 的版本中文档容错能力差
lxml HTML 解析器 BeautifulSoup(markup, “lxml”)
  • 速度快
  • 文档容错能力强
  • 需要安装C语言库
lxml XML 解析器 BeautifulSoup(markup, [“lxml”, “xml”])BeautifulSoup(markup, “xml”)
  • 速度快
  • 唯一支持XML的解析器
  • 需要安装C语言库
html5lib BeautifulSoup(markup, “html5lib”)
  • 最好的容错性
  • 以浏览器的方式解析文档
  • 生成HTML5格式的文档
  • 速度慢
  • 不依赖外部扩展

4.

r = requests.get('http://www.baidu.com/')
soup = BeautifulSoup(r.text, 'html.parser') soup = BeautifulSoup(open('index.html')) print soup.prettify() #美化HTML代码显示

5.

Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象:

soup.head
soup.a
#显示第一个同名标签
soup.head.name #显示标签名称,这里输出‘head’
soup.head.attrs #显示标签的属性,以字典形式返回所有属性
soup.head['class'] #显示head标签的class属性值
soup.head['class'] = 'newclass' #修改head标签class属性值为‘newclass’
del soup.head['class'] #删除head标签的class属性
soup.head.string  #获取标签内的正文内容,返回值类型为NavigableString

6.遍历

soup.body.contents[0]  #获取body标签的第一个子结点,contents是一个列表
for child in soup.body.children:
print(child.string) #children与contents一样,都获取全部直接子结点,只不过children是一个生成器,需遍历取出 for child in soup.body.descendants:
print(child.string) #递归遍历获取自身下面所有层级的所有节点,从最高一层列出然后下一层,直到最底层。 for string in soup.body.children.strings:
print(repr(string)) #strings获取多个正文内容,需遍历取出,stripped_strings去掉每个字符串前后空格及空行,多余的空格或空行全部去掉,使用方法与strings一致 soup.body.parent #获取父节点
for parent in soup.head.title.string.parents:
print(parent.name) #遍历上级节点路径,返回结果为title,head,html .next_sibling #下一兄弟节点
.previous_sibling #上一兄弟节点
.next_siblings  #往下遍历所有兄弟节点
.previous_siblings #往上遍历所有兄弟节点
.next_element   #下一节点,不分层级
.previous_element #上一节点,不分层级
.next_elements   #往下顺序遍历所有节点,不分层级
.previous_elements #往上遍历所有节点,不分层级

7.搜索查找标签

find_all( name , attrs , recursive , text , **kwargs )
#例:
#(1)name参数
soup.find_all('a') #查找所有a标签
soup.body.div.find_all('a') #查找body下面第一个div中的所有a标签 for tag in soup.find_all(re.compile('^b'));
print(tag.name) #正则表达式查找所有以b开头的标签 soup.find_all(['a','b']) #列表查找,返回所有a标签和b标签 soup.find_all(True) #为True时,所有标签都满足搜索条件,返回所有标签 #以下为自定义过滤条件,筛选满足自定义条件的标签
def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
soup.find_all(has_class_but_no_id) #返回所有具有class属性但无id属性的标签 #(2)attrs参数,以标签属性搜索
soup.find_all(id='nd2') #返回所有标签中属性id等于nd2的标签
soup.find_all(href=re.compile("elsie"), id='link1') #多个条件同时筛选,可用正则表达式
soup.find_all("a", class_="sister") #属性中如果有python关键字,比如class属性,不可以直接class='sister',应加个下划线与python关键字区分class_='sister'
soup.find_all(attrs={"data-foo": "value"})
#类似于html5中的data-foo属性不可直接写为soup.find_all(data-foo='value'),因为python命名规则中不允许有中划线(即横杠),应以字典形式传入attrs参数中,所有的属性搜索都可以使用这种方法 #(3)text参数
soup.find_all(text="Tillie") #搜索文档中的字符串内容为tillie,与name参数一样,可用列表、正则表达式等 #(4)limit参数
soup.find_all('a', limit=2) #返回搜索文档中前两个a标签,文档较大时可节约资源 #(5)recursive参数
soup.head.find_all("title", recursive=False)
#在head的直接子节点中搜索,默认为recursive=True,表示在所有子孙节点中搜索
find( name , attrs , recursive , text , **kwargs )
#与find_all用法完全一致,区别在于find只返回第一个满足条件的结果,而find_all返回的是一个列表,需遍历操作
#以下方法参数用法与 find_all() 完全相同,下面只列出区别

find_parents()  find_parent()
#find_all() 和 find() 只搜索当前节点的所有子节点,孙子节点等. find_parents() 和 find_parent() 用来搜索当前节点的父辈节点,搜索方法与普通tag的搜索方法相同,搜索文档搜索文档包含的内容 find_next_siblings()  find_next_sibling()
#这2个方法通过 .next_siblings 属性对当 tag 的所有后面解析的兄弟 tag 节点进行迭代, find_next_siblings() 方法返回所有符合条件的后面的兄弟节点,find_next_sibling() 只返回符合条件的后面的第一个tag节点 find_previous_siblings()  find_previous_sibling()
#这2个方法通过 .previous_siblings 属性对当前 tag 的前面解析的兄弟 tag 节点进行迭代, find_previous_siblings() 方法返回所有符合条件的前面的兄弟节点, find_previous_sibling() 方法返回第一个符合条件的前面的兄弟节点 find_all_next()  find_next()
#这2个方法通过 .next_elements 属性对当前 tag 的之后的 tag 和字符串进行迭代, find_all_next() 方法返回所有符合条件的节点, find_next() 方法返回第一个符合条件的节点 find_all_previous() 和 find_previous()
#这2个方法通过 .previous_elements 属性对当前节点前面的 tag 和字符串进行迭代, find_all_previous() 方法返回所有符合条件的节点, find_previous()方法返回第一个符合条件的节点

python中的BeautifulSoup使用小结的更多相关文章

  1. 第14.12节 Python中使用BeautifulSoup解析http报文:使用select方法快速定位内容

    一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>和<第14.11节 Python中使用BeautifulSo ...

  2. 第14.11节 Python中使用BeautifulSoup解析http报文:使用查找方法快速定位内容

    一. 引言 在<第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问>介绍了BeautifulSoup对象的主要属性,通过这些属性可以访 ...

  3. 第14.10节 Python中使用BeautifulSoup解析http报文:html标签相关属性的访问

    一. 引言 在<第14.8节 Python中使用BeautifulSoup加载HTML报文>中介绍使用BeautifulSoup的安装.导入和创建对象的过程,本节介绍导入后利用Beauti ...

  4. 第14.8节 Python中使用BeautifulSoup加载HTML报文

    一. 引言 BeautifulSoup是一个三方模块bs4中提供的进行HTML解析的类,可以认为是一个HTML解析工具箱,对HTML报文中的标签具有比较好的容错识别功能.阅读本节需要了解html相关的 ...

  5. 在Python中使用BeautifulSoup进行网页爬取

    目录 什么是网页抓取? 为什么我们要从互联网上抓取数据? 网站采集合法吗? HTTP请求/响应模型 创建网络爬虫 步骤1:浏览并检查网站/网页 步骤2:创建用户代理 步骤3:导入请求库 检查状态码 步 ...

  6. 关于python中lambda 函数使用小结

    例子: 如果定义普通函数,一般都是这样写: def:ds(x): return 2*x+1 调用即: ds(5) 如果用lambda函数就是这么写,就是一句话: g =lambda x:2*x+1 调 ...

  7. python中的变量引用小结

    python的变量都可以看成是内存中某个对象的引用.(变量指向该内存地址存储的值) 1.python中的可更改对象和不可更改对象 python中的对象可以分为可更改(mutable)对象与不可更改(i ...

  8. python中的requests使用小结

    现接触到的很少,详细的官方教程地址: requests官方指南文档:http://docs.python-requests.org/zh_CN/latest/user/quickstart.html ...

  9. Python中的BeautifulSoup库简要总结

    一.基本元素 BeautifulSoup库是解析.遍历.维护“标签树”的功能库. 引用 from bs4 import BeautifulSoup import bs4 html文档-标签树-Beau ...

随机推荐

  1. [COCI2017-2018#6] Alkemija

    题意 一共有 \(n\) 种物质,已知开始你有 \(m\) 种物质且数量足够多,再给出 \(K\) 个物质的转化规则(一堆物质变成另一堆),问一共能够得到多少种物质. 分析 对 \(n\) 种物质和 ...

  2. Number.toString SyntaxError

    问题分析 问题 20.toString(); VM163:1 Uncaught SyntaxError: Invalid or unexpected token 分析 "."号的原 ...

  3. 使用VSCode调试单个PHP文件

    突然发现是可以使用 VSCode 调试单个 PHP 文件的,今天之前一直没有弄成功,还以为 VSCode 是不能调试单文件呢.这里记录一下今天这个"突然发现"的过程. 开始,是在看 ...

  4. 【转】Cocos2d-x 3.x基础学习: 总结数学类Vec2/Size/Rect

    转载:http://www.taikr.com/article/1847 在Cocos2d-x 3.x中,数学类Vec2.Size.Rect,是比较常用的类.比如设置图片位置,图片大小,两图片的碰撞检 ...

  5. telnet协议:简介与安装使用

    Telnet简介 Telnet协议是TCP/IP协议族中的一员,是Internet远程登陆服务的标准协议和主要方式.它为用户提供了在本地计算机上完成远程主机工作的能力.在终端使用者的电脑上使用teln ...

  6. Win10 + vs2017 编译并配置tesseract4.1.0

    tesseract 是一个开源的OCR (Optical Character Recognition , 光学字符识别) 引擎,本文就介绍一下自己在编译 tesseract4.1.0时遇到的一些坑,希 ...

  7. django反向解析URL和URL命名空间

    django反向解析URL和URL命名空间 首先明确几个概念: 1.在html页面上的内容特别是向用户展示的url地址,比如常见的超链接,图片链接等,最好能动态生成,而不要固定. 2.一个django ...

  8. html5实现拖拽上传头像

    1. 将客户端(本地电脑)中的图片拖到网页中 要点: html5 拖放, FileReader html: <div id="container" ondrop=" ...

  9. 20135202闫佳歆--week2 一个简单的时间片轮转多道程序内核代码及分析

    一个简单的时间片轮转多道程序内核代码及分析 所用代码为课程配套git库中下载得到的. 一.进程的启动 /*出自mymain.c*/ /* start process 0 by task[0] */ p ...

  10. Visual studio 2013 安装的漫长过程

    本周有一个任务是安装VS 2013版本,下载了安装包,七点多G,oh my god!!! 图上维持了两三个小时,可能我电脑台low了..... 因为是win7系统,需要进行重启电脑. 安装成功之后. ...