对于一个最简单的爬虫结构的代码是这样的。

也就是抓取出整个页面,然后创建一个BeautifulSoup对象。

from urllib.request import urlopen
from bs4 import BeautifulSoup
html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")
bsObj = BeautifulSoup(html)

find()和findAll()

这两个函数非常相似,是用来通过标签的不同属性来过滤HTML页面,查找需要的标签组或单个标签的。BeautifulSoup文档里两者的定义就是这样:

findAll(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords)

标签参数tag

你可以传一个标签的名称或多个标签名称组成的Python列表做标签参数。比如:

bsObj.findAll({"h1","h2","h3","h4"})

属性参数attributes

它是用一个Python字典封装一个标签的若干属性和对应的属性值。比如,下面这个函数会返回HTML文档里红色和绿色两种颜色的span标签:

bsObj.finaAll("span",{"class":{"green", "red"}})

递归参数recursive

它是一个布尔变量。如果设置为True,findAll就会根据你的要求去查找标签参数的所有子标签,以及子标签的子标签。如果设置为False,findAll就只查找文档的一级标签。默认是支持递归查找的,所以一般这个参数不需要设置。

文本参数text

它是用标签的文本去匹配,而不是用标签的属性。比如:

nameList = bsObj.findAll(text="the prince")
print(len(nameList))

范围限制参数limit

find()其实等价于findAll()的limit等于1时的情形。如果你只对网页中获取的前n项结果感兴趣,就可以设置它。

关键词参数keyword

它可以让你选择那些具有指定属性的标签。比如:

allText=bsObj.findAll(id="text")
print(allText[0].get_text())

但是,keyword偶尔会出现问题,尤其是在用class属性查找标签的时候,因为class是Python中受保护的关键字。但是可以用BeautifulSoup提供的另一种方案,在class后面增加一个下划线

# 错误
bsObj.findAll(class="green")
# 正确
bsObj.findAll(class_="green")
bsObj.findAll("",{"class":"green"})

get_text()

get_text()会把正在处理的HTML文档中所有的标签都清楚,然后返回一个只包含文字的字符串。

通常在你准备打印、存储和操作数据时,应该最后才使用get_text()。一般情况下,你应该尽可能地保留HTML文档的标签结构。

导航树

如果需要通过标签在文档中的位置来查找标签,那么就要用到导航树(Navigating Trees)。

虚拟的在线购物网站作为要抓取的示例网页,这个HTML页面可以映射成一棵树,如下所示:

-body
-div.wrapper
-h1
-div.content
-table#giftList
-tr
-th
-th
-th
-th
-tr.gift#gitf1
-td
-td
-span.excitingNote
-td
-td
-img
-……其他表格行省略了……
-div.footer

子标签与后代标签

在BeautifulSoup库里,孩子(child)后代(descendant)有显著的不同。

子标签就是一个父标签的下一级,而后代标签是指一个父标签下面所有级别的标签。

比如,tr标签是table标签的子标签,而tr、th、td、img和span标签都是table标签的后代标签。

也就是所有的子标签都是后代标签,但不是所有的后代标签都是子标签。

如果只想找出子标签,可以使用children()函数

from urllib.request import urlopen
from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html) for child in bsObj.find("table",{"id":"giftList"}).children:
print(child)

这段代码会打印gitfList表格中所有产品的数据行。

而如果使用的是descendants()函数就会有二十几个标签打印出来,包括img标签等。

兄弟标签

next_siblings()函数可以让收集表格数据成为简单的事情,尤其是处理带标题行的表格:

from urllib.request import urlopen
from bs4 import BeautifulSoup html = urlopen("http://www.pythonscraping.com/pages/page3.html")
bsObj = BeautifulSoup(html) for sibling in bsObj.find("table",{"id":"giftList"}).tr.next_siblings:
print(sibling)

这段代码会打印产品列表里所有行的产品,第一行表格标题除外。因为自己不能是自己的兄弟标签,而且这个函数只调用后面的兄弟标签。

如果一组兄弟标签里的最后一个标签比较好找,也可以用previous_siblings()函数

获取标签属性

有时候我们需要的数据在标签属性里,那么我们可以使用下面的代码获取它的全部属性:

myTag.attrs

这行代码返回的是一个Python字典对象,可以获取和操作这些属性。

比如要获取图片的资源位置src,可以这样使用:

myImgTag.attrs["src"]

【参考】

[1]《Python网络数据收集》Ryan Mitchell

【Python学习】使用BeautifulSoup解析HTML的更多相关文章

  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. python学习(25) BeautifulSoup介绍和实战

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

  4. python学习之BeautifulSoup模块爬图

    BeautifulSoup模块爬图学习HTML文本解析标签定位网上教程多是爬mzitu,此网站反爬限制多了.随意找了个网址,解析速度有些慢.脚本流程:首页获取总页数-->拼接每页URL--> ...

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

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

  6. python学习之----BeautifulSoup的find()和findAll()及四大对象

    BeautifulSoup 里的find() 和findAll() 可能是你最常用的两个函数.借助它们,你可以通 过标签的不同属性轻松地过滤HTML 页面,查找需要的标签组或单个标签. 这两个函数非常 ...

  7. python学习之----BeautifulSoup示例二

    网络爬虫可以通过class 属性的值,轻松地区分出两种不同的标签.例如,它们可以用 BeautifulSoup 抓取网页上所有的红色文字,而绿色文字一个都不抓.因为CSS 通过属性准 确地呈现网站的样 ...

  8. python学习之----BeautifulSoup示例一

    BeautifulSoup 库最常用的对象恰好就是BeautifulSoup 对象. from urllib.request import urlopen from bs4 import Beauti ...

  9. python网络爬虫之解析网页的BeautifulSoup(爬取电影图片)[三]

    目录 前言 一.BeautifulSoup的基本语法 二.爬取网页图片 扩展学习 后记 前言 本章同样是解析一个网页的结构信息 在上章内容中(python网络爬虫之解析网页的正则表达式(爬取4k动漫图 ...

  10. python爬虫之Beautifulsoup学习笔记

    相关内容: 什么是beautifulsoup bs4的使用 导入模块 选择使用解析器 使用标签名查找 使用find\find_all查找 使用select查找 首发时间:2018-03-02 00:1 ...

随机推荐

  1. ZOJ3529_A Game Between Alice and Bob

    题目的意思是给你若干个数字,两个游戏者轮流操作,每次可以将该数变为一个小于当前的一个约数,无法操作的游戏者fail. 和其他的博弈题目大同小异吧. 不同点有两个,逐一分析吧. 一.每次改变一个数只能改 ...

  2. SWERC2015-I Text Processor

    题意 给一个长度为\(n\)的字符串\(s\),再给定一个\(w\),问对于所有的\(i\in [1,n-w+1]\),\(s[i..i+w-1]\)有多少个不同字串.\(n,w\le 10^5\). ...

  3. 洛谷 P3177 树上染色

    题面 题目要求将k个点染成黑色,求黑点两两距离及白点两两距离,使他们之和最大. 我们可以将距离转化为路径,然后再将路径路径拆分成边,就可以记录每条边被经过的次数,直接计算即可. 很简单对吧?那么问题来 ...

  4. MD5加密概述

    一.Note: 写到这篇文章是工作中实际遇到了,以前都听过不过没有细看.这里简单概述下,原理的话需要看看更专业的介绍了. 二.MD5简介 Message Digest Algorithm MD5(中文 ...

  5. Qt Widgets、QML、Qt Quick的区别

    Qt Widgets.QML.Qt Quick的区别 简述 看了之前关于 QML 的一些介绍,很多人难免会有一些疑惑: Q1:QML 和 Qt Quick 之间有什么区别? Q2:QtQuick 1. ...

  6. 转:SVM与SVR支持向量机原理学习与思考(一)

    SVM与SVR支持向量机原理学习与思考(一) 转:http://tonysh-thu.blogspot.com/2009/07/svmsvr.html 弱弱的看了看老掉牙的支持向量机(Support ...

  7. kerberos中的spn详解

    0x01 SPN定义    服务主体名称(SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称.Kerberos身份验证使用SPN将服务实例与服务登录帐户相关联. ...

  8. Function.caller, arguments.caller, arguments.callee, arguments.callee.calller

    Function.caller指向当前函数的调用者,是arguments.caller的替代者 arguments.caller也是指向当前函数的调用者,已被废弃 arguments.callee是对 ...

  9. bnuoj53075 外挂使用拒绝

    题目链接:http://www.bnuoj.com/v3/problem_show.php?pid=53075 第一次给校赛出题,来为自己的题目写一发题解吧. 其实我原本的题意非常简洁: 结果被另一位 ...

  10. php的自动加载函数spl_autoload_register和__autoload

    spl_autoload_register和__autoload是用来自动加载类的,不用每次都require,include这样搞. 先说__autoload的用法, 在同级目录建立2个文件,一个in ...