转自:http://www.cnblogs.com/franknihao/p/6542460.html

【Python】 html解析BeautifulSoup

BeautifulSoup

  bs是个html解析模块,常用来做爬虫?

  ■  安装

  BeautifulSoup可以通过pip来安装,用pip install beautifulsoup4 即可。但是仅仅这样安装的bs,其默认的html解析器是python自带的HTMLParser模块,性能不是很好。可以考虑安装性能更加好的lxml和html5lib模块:pip install html5lib

  

  ■  基本用法

  BeautifulSoup有官方文档,可以查阅

  ① 建立BeautifulSoup对象,它是基于一个html字符串或者一个文件

from bs4 import BeautifulSoup
soup = BeautifulSoup("...一串html")
#或者
soup = BeautifulSoup(open("文件路径","r"))print soup.prettify()    #可以美化这段html并打印出来

  ②  四类对象

   bs将一个html抽象成一个树形结构,每个节点都是一个python里的对象。共分成了四种对象。

   ●  Tag类对象

    即html中的标签,BeautifulSoup对象(以上面代码中的soup为例)可以直接在后面接上某种标签的名称,得到的对象是该种标签在这段html中的第一个实例。

    比如对于print soup.h1 >>> <h1 class="...">...</h1>  (bs里的html对象是可打印的,打印出来就是html原文)

    每个Tag类对象都有两个属性,name和attrs。

    name就是标签的名字,而attrs是个字典,里面记录了所有这个tag的属性值。比如有tag是<h1 class="space-seo space-meta" name="testname">HELLO</h1>

    其name就是u'h1',而attrs是{u'class':[u'space-seo',u'space-meta'],u'name':u'testname'}  //注意区别tag对象的name属性和写在attrs里面的name属性的区别,另外所有被存到变量里的html内容全部都变成了unicode对象。在print的时候可以指定encode,默认encode是utf-8。还有,所有class属性都默认都被解析成一个列表,即便只有一个class值,也会成为[u'class_value']

    当然,在定位到Tag对象之后可以获取查看其属性值,另一方面,也可以对其属性值等进行修改,修改完了之后就是存在内存中的这个变量里面的,最终可以输出成文件的形式。

   ●  String对象  //selenium用的是text来指代标签内部的文本内容,而bs用的是string。而且对于<div>这种本身不带文本带后辈节点可能带文本的标签两者意义不同。selenium中的.text会带出来所有后辈节点中的文本,而bs中的这个.string返回的是None

    String对象用于代表每个元素所含的文字部分,在标签后面加上.string即可调用

    print soup.h1.string >>> HELLO

    注意,某个Tag对象的子节点以及子节点里面的内容都不算进string,当一个元素(比如<div>这种)里面只有子节点,本身没有文字的话,得到的就是None。

    ●  BeautifulSoup对象

    指代整个文档的对象。可以视为是<html>的对象。其实之前创建的BeautifulSoup对象soup,就是指代整个html文档

    ●  comment对象

    用于代表某个元素内的注释

■  遍历文件树

    除了上面提到的一些基本属性,Tag对象(包括BeautifulSoup对象)都含有以下属性:

    Tag.contents  将某个Tag的各个子节点(不包括孙和孙以下节点)按照列表的方式输出

    Tag.children  返回一个上述列表的迭代器,也只有子节点(没有孙和孙以下节点)

    Tag.descendants  返回一个迭代器,内容是所有后辈节点

    Tag.strings  返回Tag中所有的文字部分的生成器,保留换行,制表符等空格。相当于是prettify之后去掉所有html标签的文本状态。

    Tag.stripped_strings  和上一项相比,再去掉所有空白字符,只保留有实际字符的文本部分。这两个方法常用于对被分析网页文本的搜索和处理。

    Tag.parent  父节点

    Tag.parents  长辈节点的迭代器

    Tag.next_sibling  下一个同辈节点(如果没有同辈就返回None,下同)

    Tag.previous_sibling  上一个同辈节点

    Tag.next_sibilings  之后所有同辈节点的迭代器

    Tag.previous_sibilings  之前所有同辈节点的迭代器

    //关于同辈节点有一个坑。。在看起来比较美观的HTML文档中,总是有很多换行符合制表符的。而在BS中如果要调用一个同辈节点,那么这些空白的文本节点也都会被算进去。比如:

#<p><span>one</span><span id="main">two</span></p>
print soup.find(name="span",attrs={"id":"main"}).previous_sibling
#得到的是<span>one</span>#如果处理的是这样一段HTML:
#<p>
#    <span>one</span>
#    <span id="main">two</span>
#</p>
print repr(soup.find(name="span",attrs={"id":"main"}).previous_sibling)
#得到的是"\n\t"因为在第一个span之前有一段空白文本被当做一个节点了。

    然而在通过这个span.parent寻找p或者是通过p.children寻找span的时候,这些空白文本节点都不会被算进去。所以只有在引用同辈节点的时候要注意。

    

    Tag.next_element  下一个元素,包括string对象,子节点,同辈分节点在内,无视辈分的下一个

    Tag.previous_element  上一个元素,说明同上

    Tag.next_elements  next_element的迭代器

    Tag.previous_elements  previous_element的迭代器

    

  ■  检索文件树方法

    ●  Tag.find_all(name,attr,recursive,text,**kwargs) 方法。功能是检索Tag内所有后辈节点,并判断是否符合某种条件,最后返回一个列表

      1.  name参数

      name参数可以直接写Tag.name。比如find_all("p"),find_all("div")等

      也可以写正则表达式(re.compile之后的对象)。比如find_all(re.compile("^b"))

      也可以写列表,比如find_all(['a','p'])

      甚至可以写一个函数对象,这时就要自己定义这个函数了。这个函数要接收一个Tag对象来作为参数,并最终返回True或者False来告诉find_all这个对象该不该被find进去

      2.  attr参数

      attr参数可以指定一个字典的形式来过滤,比如find_all(attrs={'id':'testid'})就是找到所有id是testid的元素

      3.  text参数

      用于搜索字串内容。也可以支持name参数中那几种写的形式。注意,返回的不是对象的列表,而是文本的列表。当name和text的参数同时出现的话,text会作为name的一个附加条件,返回的还是带标签的列表。

      4.  recursive参数

      默认是True,可改成False放弃递归进子辈以下子节点。只检索第一级的子节点。

      5.  limit参数

      有时候文档太大了,检索所有元素很费时间,limit可以指定一个数值,当检索找到了这个数量的目标之后就停止检索

   

     ●  Tag.find方法:参数和find_all一致,只不过其返回的不是一个列表,而是找到第一个就返回了。

     ●  Tag.find_parents    Tag.find_parent

      Tag.find_next_sibilings    Tag.find_next_sibiling

      Tag.find_previous_sibilings    Tag.find_previous_sibiling

      Tag.find_all_next    Tag.find_next

      Tag.find_all_previous  Tag.find_previous

      以上所有方法,每行前一个和后一个的关系就是find_all和find的关系。而每一行相当于是为检索指定了一个大致的范围。比如说find_all和find是在所有后辈节点中检索的话,那么find_parents和find_parent就是在所有长辈节点中寻找,find_next_sibilings和find_next_sibiling就是在所有后面的同辈节点中寻找等等

    

     ●  Tag.select("selector")  可以借助select方法来确定一个或多个特定的元素,默认查找全部符合的元素并返回一个列表。selector的语法就是jQuery里面selector的语法。这个方法还是比较实用的。与之相对的有select_one方法,只返回第一个查找到的元素。

总的来说,不管是通过一个节点,遍历文件树的方法来找到想要获得的节点对象,还是通过检索方法来定位一个节点对象,都是寻找对象的一种方法。很难说哪种最好哪种不好,应该要灵活运用。

【Python】 html解析BeautifulSoup相关推荐

  1. Python爬虫解析网页的4种方式 值得收藏

    用Python写爬虫工具在现在是一种司空见惯的事情,每个人都希望能够写一段程序去互联网上扒一点资料下来,用于数据分析或者干点别的事情. 我们知道,爬虫的原理无非是把目标网址的内容下载下来存储到内存中, ...

  2. python网络爬虫--BeautifulSoup

    本随笔记录学习崔庆才老师编著的<Python3网络爬虫开发实战>以及<Beautiful Soup 4.4.0文档>. 安装BeautifulSoup4以及解析器 Instal ...

  3. python学习(25) BeautifulSoup介绍和实战

    BeautifulSoup是python的html解析库,处理html非常方便 BeautifulSoup 安装 pip install beautifulsoup4 BeautifulSoup 配合 ...

  4. Beautiful Soup4(bs4)在python中解析页面信息以及csv格式

    # 1. 概括 - 获取页面: urllib, requests - 解析页面信息: 正则表达式, BeautifulSoup4(BS4)# 2. BS4简介 Beautiful Soup提供一些简单 ...

  5. 06—小白学Python爬虫之BeautifulSoup入门与应用(以糗百为例)

    之前介绍了通过正则和xpath来解析HTML文本,本篇将会介绍一种全新的方式BeautifulSoup来解析HTML,相对前两种使用更简单,那么,在介绍之前,先对这三种方式做一个简单的对比. 抓取方式 ...

  6. Python爬虫:BeautifulSoup库

    Beautiful Soup的简介 Beautiful Soup是python的一个库,最主要的功能是从网页抓取数据.官方解释如下: 1.Beautiful Soup提供一些简单的.python式的函 ...

  7. Python BS4解析库用法详解

    Python BS4解析库用法详解 Beautiful Soup 简称 BS4(其中 4 表示版本号)是一个 Python 第三方库,它可以从 HTML 或 XML 文档中快速地提取指定的数据.Bea ...

  8. Python bs4解析库使用详解

    今天继续给大家介绍Python 爬虫相关知识,本文主要内容是Python bs4解析库使用详解. 一.Python bs4库简介与安装 bs4是Python的一个第三方库,主要用于从HTML或者是XM ...

  9. 了解女友的心还不如了解Python之在Python中解析和修改XML

    2021年12月15日 10:14 ·  阅读 30 摘要: 工作中我们时常需要解析用不同语言编写的数据.Python 提供了许多库来解析或拆分用其他语言编写的数据.在这篇 Python XML 解析 ...

  10. python列表解析的新方法

    python 列表解析我感觉是python非常灵活的一个地方,一开始接触它的时候,特别是之前学过其它的语言, 你会感觉很不习惯,怎么看怎么不对劲,老是觉的哪个地方怪怪的,这就是列表解析的魔力所在. p ...

最新文章

  1. “九”答不可 | 量子保密,完美无缺?
  2. Java - 探究前后分离带来的跨域问题
  3. OpenGL在frag着色器中模拟手电筒效果
  4. DataWorks功能实践速览 — 参数透传
  5. 【附超时原因】1055 The World‘s Richest (25 分)_42行代码AC
  6. html表格在页面间距,在CSS中设置单元格和单元格间距?
  7. 前端:HTML5/36/HTML5简介,文档类型定义,网页字符集,页面结构标记,文章相关的标记,其它标记,音频标记,视频标记,表单中新增的属性,表单input元素type属性的值
  8. golang(5)使用beego 开发 api server 和前端同学拆分开发,使用swagger
  9. 视频点播服务器实现视频转码和视频播出功能
  10. 搭建 sock5代理服务器
  11. ML for trading -cs7646-02
  12. jxls设置隐藏列隐藏行
  13. MWC-电机、电池螺旋桨搭配
  14. 求有限区间内素数个数
  15. 【光学】基于矩阵法和等效界面法分析光学薄膜膜对反射率影响附matlab代码
  16. 小米 解析软件包时出现问题 解决
  17. spark.yarn.archive spark.yarn.jars
  18. 9.9 优美三角剖分 2718
  19. 注册公司流程和费用(2016版)
  20. echarts世界地图,国家名称翻译

热门文章

  1. (day9)357. 计算各个位数不同的数字个数
  2. Flask-Uploads文件上传的简单使用
  3. GPO 安装 .net 4.5和WMF4
  4. CodeBlocks13.12汉化以及去掉注释及字符串的下划线
  5. Data Guard Service 相关介绍
  6. 无法注册这篇文档........
  7. 基于模板的代码生成器
  8. 易语言-MD5加密16位和32位方法
  9. Oracle11g常用数据字典(转)
  10. linux服务器MySQL数据从磁盘拷贝以及恢复