BeautifulSoup

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

  ■  安装

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

  

  ■  基本用法

  BeautifulSoup有官方文档,可以查阅

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

  1. from bs4 import BeautifulSoup
  2. soup = BeautifulSoup("...一串html")
  3. #或者
  4. soup = BeautifulSoup(open("文件路径","r"))
  5.  
  6. 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中如果要调用一个同辈节点,那么这些空白的文本节点也都会被算进去。比如:

  1. #<p><span>one</span><span id="main">two</span></p>
  2. print soup.find(name="span",attrs={"id":"main"}).previous_sibling
  3. #得到的是<span>one</span>
  4.  
  5. #如果处理的是这样一段HTML:
  6. #<p>
  7. # <span>one</span>
  8. # <span id="main">two</span>
  9. #</p>
  10. print repr(soup.find(name="span",attrs={"id":"main"}).previous_sibling)
  11. #得到的是"\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爬虫】BeautifulSoup网页解析库

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

  2. python爬虫解析库之Beautifulsoup模块

      一 介绍 Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会 ...

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

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

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

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

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

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

  6. Python网页解析

    续上篇文章,网页抓取到手之后就是解析网页了. 在Python中解析网页的库不少,我最开始使用的是BeautifulSoup,貌似这个也是Python中最知名的HTML解析库.它主要的特点就是容错性很好 ...

  7. Python 爬虫 解析库的使用 --- Beautiful Soup

    知道了正则表达式的相关用法,但是一旦正则表达式写的有问题,得到的可能就不是我们想要的结果了.而且对于一个网页来说,都有一定的特殊结构和层级关系,而且有很多节点都有id或class来做区分,所以借助它们 ...

  8. python爬虫解析页面数据的三种方式

    re模块 re.S表示匹配单行 re.M表示匹配多行 使用re模块提取图片url,下载所有糗事百科中的图片 普通版 import requests import re import os if not ...

  9. python中的BeautifulSoup使用小结

    1.安装 pip install beautifulsoup4 2.代码文件中导入 from bs4 import BeautifulSoup 3. 解析器 使用方法 优势 劣势 Python标准库 ...

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

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

随机推荐

  1. FusionCharts 3D帕累托图

    1.设计3D帕累托图的页面 Pareto3D.html: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN&q ...

  2. 小白——java基础之数据类型

    PS:此文章为小白提供,大佬请绕道!!!! 首先特别感谢大才哥给我提供这个平台,未来我希望把java这个版块的内容补全. 今天要讲的是数据类型,最最最基础的内容~ java标识符.数据类型.关键字 开 ...

  3. python爬虫--爬取某网站电影下载地址

    前言:因为自己还是python世界的一名小学生,还有很多路要走,所以本文以目的为向导,达到目的即可,对于那些我自己都没弄懂的原理,不做去做过多解释,以免误人子弟,大家可以网上搜索. 友情提示:本代码用 ...

  4. Car HDU - 5935

    Problem Description Ruins is driving a car to participating in a programming contest. As on a very t ...

  5. springtest-junit-jidi--测试接口

    一,问题分析 假如在一个项目中要测试一个接口,但是这个项目没有对外开放url地址,话句话就是说浏览器访问不了里面的资源,自己造的数据不能测试接口,那么只能等别人来调用自己的接口,而且自己也不能测试,假 ...

  6. [BZOJ2743] [HEOI2012] 采花 (树状数组)

    Description 萧芸斓是Z国的公主,平时的一大爱好是采花. 今天天气晴朗,阳光明媚,公主清晨便去了皇宫中新建的花园采花.花园足够大,容纳了n朵花,花有c种颜色(用整数1-c表示),且花是排成一 ...

  7. UNDO及MVCC、崩溃恢复

    UNDO特性:避免脏读.事务回滚.非阻塞读.MVCC.崩溃恢复 事务工作流程(图2) MVCC原理机制 崩溃恢复:redo前滚.undo回滚 长事务.大事务:危害.判断.处理 UNDO优化:实现und ...

  8. Delphi关于TAdvStringGrid控件颜色的设置

    FixedFont-Color 标题行和列字体的颜色 Font-color 单元格字体的颜色Visual-color 整个表格的背景色填充

  9. .NET Core 配置Configuration杂谈

    前言 .NET Core 在配置文件的操作上相对于.NET Framework做了不少改变,今天来聊一聊.关于Configuration的Package都是以Microsoft.Extensions. ...

  10. 锐动视频SDK在金融业务加密双录管理系统通用解决方案

    为了更好地保障消费者的合法权益,银监会和保监会提出了要求,在银行.保险从业人员销售理财产品或代理其他机构销售产品时,同期进行录音录像,确保销售人员按程序.按规定介绍产品,以便购买者更清楚地了解产品的性 ...