彼得天空-个人心地带 彼得天空-个人心地带

金泰妍,Python爬虫库-Beautiful Soup的运用,灼

作者:msq3
来历:https://www.jianshu.com/p/5c239bcd05a3

Beautiful 金泰妍,Python爬虫库-Beautiful Soup的运用,灼Soup是一个能够从HTML或XML文件中提取数据的Python库,简略来说,它能将HhdgayTML的标签文件解析成树形结构,然后方便地获取到指定标签的对应特点。

经过Beautiful Soup库,咱们能够将指定的class或id值作为参数,来直接获取到对应标签的相关数据,这样的处理办法简洁明了。

当时最新的 Beautiful Soup 版别为4.4.0,Beautiful Soup 3 当时已中止保护。

Beautiful Soup 4 可用于 Python2.7 和 Python3.0,本文示例运用的Python版别为2.7。

博主运用的是Mac体系,直接经过指令装置库:

sudo easy_install beautifulsoup4

装置完结后,测验包括库运转:

from bs4 import BeautifulSoup

若没有报错,则阐明库已正常装置完结。

开端

本文会经过这个网页http://reeoo.com来进行示例解说,如下图所示

Python爬虫库-Beautiful Soup的运用


BeautifulSoup 目标初始化

将一段文档传入 BeautifulSoup 的结构办法,就能得到一个文档目标。如玄阳永夜下代码所示,文档经过恳求url获取:

Python爬虫库-Beautiful Soup的运用

request 恳求没有做反常处理,这儿暂时先疏忽。BeautifulSoup 结构办法的第二个参数为金泰妍,Python爬虫库-Beautiful Soup的运用,灼文档解析器,若不传入该参数,BeautifulSoup会陌上不系舟自行挑选最合适的解析器来解析文档,不过会有正告提示。

也能够经过文件句柄来很想吃掉你初始化,可先将HTML的源码保存到本地同级目录 reo.html,然后将文件名作为参数:

soup = BeautifulSoup(open('reo.html'))

能够打印 soup,输出内容和HTML文本无二致,此刻它为一个杂乱的树形结构,每个节点都是Python目标。

Ps. 接下来示例代码金泰妍,Python爬虫库-Beautiful Soup的运用,灼中所用到的 soup 都为该soup。

Ta林婉馨的大学生活g

Tag目标与HTML原生文档中的标签相同,能够直接经过对应姓名获取

tag = soup.title
print tag

打印成果:

Reeoo - web design inspiration and website gallerytitle><br>

Name

经过Tag目标的name特点,能够获取到标签的称号

print tag.name
# title

Attributes

一个tag或许包括许多特点,如id、class等,操作tag特点的办法与字典相同。

例如网页中包括缩略图区域的标签 article

获取它 class 特点的值

tag = soup.article
c = tag['class']
print c
# [u'box']

也能够直接经过 .attrs 获取一切的特点

tag = soup.article
attrs = tag.attrs
print attrs
# {u'class': [u'box']}

ps. 由于class归于多值特点,所以它的值为数组。

tag中的字符串

经过 stri战破蛮荒ng 办法获取标签中包括的字符串

tag = soup.title
s = tag.string
print s
# Reeoo - web design inspiration and website gallery

文档树的遍历

一个Tag或许包括多个字符串或其它的Tag,这些都是这个Tag的子节点。Beautiful Soup供给了许多操作和遍历子节点的特点。

子节点

经过Tag的 name 能够获取到对上原奈奈应标签,屡次调用这个办法,能够获取到子节点中对应的标签。

如下图:


咱们期望获取到 article 标签中的 li

tag = soup.article.div.ul.li
print tag

打印成果:

也能够把中心的一些节点省掉,成果也共同

tag = soup.article.li

经过 . 特点只能获取到第一个tag,若想获取到一切的 li 标签,能够经过 find_all() 办法

ls = soup.article.div.ul.find_all('li')

获取到的是包括一切li标签的列表。

tag的 .contents 特点能够将tag的子节点以列表的办法输出:

tag = soup.article.div.ul
contents = tag.contents

打印 contents 能够看到列表中不只包括了 li 标签内容,还包括了换行符 '\n'

过tag的 .children 生成器,能够对tag的子节点进行循环

tag = soup.article.div.ul
children = tag.children
print children
for 根浴child in chi皇牌兵王ldren:
print child

能够看到 children 的类型为

.contents 和 .cuzrohildren 特点仅包括tag的直接子节点,若要遍历子节点的子节点,能够经过 .descendants 特点,办法与前两者相似,这儿不列出来了。

父节点

经过 .parent 特点来获取某个元素的父节点,article 的 父节点为 body。

tag = soup.article
print tag.parent.name
# body

或许经过 .parents 特点遍历一切的父辈节点。

tag = soup.article
for p in tag.parents:
print p.name

兄弟节点

.next_sibling 和 .previous_sibling 特点用来插叙兄弟节点,运用办法与其他的节点相似。

文档树的查找

对树形结构的文档进行特定的查找是爬虫抓取进程中最常同仁圣方用的操作。

find_all()

find_all(name , attrs , recursive , string , ** kwargs)

name 参数

查找一切姓名为 name 的tag

keyword 参数

假如指定参数的姓名不是内置的参数名(name , attrs , recursive , string),则将该参数当成tag的特点进行查找,不指定tag的话则默以为对一切tag进行查找。

如,查找一切 id 值为 footer 的标签

soup.find_all(id='footer')
# [
\n
\n

... div>\nfooter>]

加上标签的参数


获取一切缩略图的 div 标签,缩略图用 class 为 thumb 符号

soup.find_all('div', class_='thumb')

这儿需求留意一点,由于 class 为Python的保存关键字,所以作为参数时加上了下划线,为“class_”。

指定姓名的特点参金泰妍,Python爬虫库-Beautiful Soup的运用,灼数值能够包括:字符串、正则表达式、列表、True/False。

True/False

是否存在指定的特点。

查找一切带有 target 特点的标签

soup.find_all(target=True)

查找一切不带 target 特点的标签(仔细观察会发现,查找成果仍是会有带 target 的标签,那是不带 target 标签的子标签,这儿需求留意一下。)

soup.find_all(target=False)

能够指定多个参数作为过滤条件,例如页面缩略图部分的标签如下所示:

查找 src 特点中包括 reeoo 字符串,而且 class 为 lazy 的标签:

soup.find_all(src=re.compile("reeoo.com"), class_='lazy')

查找成果即为一切的缩略图 img 标签。

有些特点不能作为参数运用,如 data-**** 特点。在上面的比如中,data-original 不能作为参数运用,运转起来会报错,SyntaxError: 十一武士keyword can't be an expression*。

attrs 参数

界说一个字典参数来查找对应特点的tag,必定程度上能处理上面说到的不能将某些特点作为参数的问题。

例如,查找包括 data-original 特点的标签

print soup.find_all(attrs={'data-original': True})

查找 data-original 特点中包括 reeoo.com 字符串的标签

soup.find_all(attrs={'data-original': re.compile("reeoo.com")})

查找 data-original 特点为指定值的标签

soup.find_all(attrs={'data-original': 'http://media.reeoo.com/Bersi Serlini Franciacorta.png!page'})

string 参数

和 name 参数相似,针对文档中的字符串内容。

查找包括 Reeoo 字符串的标签:

soup.find_all(string=re.compile("Reeoo"))

打印查找成果可看到包括3个元素,分别是对应标签里的内容,详细见下图所示




limit 参数

find_all() 回来的是整个文档的查找成果,假如文档内容较多则查找进程耗时过长,加上 limit 约束,当成果到hklab达 l杨予欣imit 值时中止查找并回来成果。

查找 class 为 thumb 的 div 标签通泉草,只查找3个

soup.find_all('div', class_='thumb', limit=3)

打印成果为一个包括3个元素的列表,实践满意成果的标签在文档里不止3个。

recursive 参数

find_all() 会检索当时tag的一切后代节点,假如只想查找tag的直接子节点,能够运用参数 recursive=False。

find()

find(name , attrs , recursive , string , ** kwargs)

find() 办法和 find_all() 办法的参数运用根本共同,仅仅 find() 的查找办法只会回来第一个满意要求的成果,等价于 find_all() 办法并将limit设金泰妍,Python爬虫库-Beautiful Soup的运用,灼置为1标商网。

soup.find_all('div', class_='thumb', l金泰妍,Python爬虫库-Beautiful Soup的运用,灼imit=1)
soup.find('div', class_='thumb')

查找成果共同,仅有的区别是 find_all() 回来的是一个数组,find() 回来的是一个元素。

当没有查找到满意条件的标签时,find() 回来 None监狱学园无修, 而 find_all() 回来一个空的列表。

CSS挑选器

Tag 或 BeautifulSoup 目标经过 select() 办法中传入字田鹤鸣符串参数, 即可运用CSS挑选器的语法找到tag。

语义和CSS共同,查找 article 标签下的 ul 标签中的 li 标签

print soup.sele金泰妍,Python爬虫库-Beautiful Soup的运用,灼ct('article ul li')

经过类名查找,两行代码的成果共同,查找 class 为 thumb 的标签

soup.select('.thumb')
soup.select('[class~=thumb]')

经过id查找,查找 id 为 sponsor 的标签

soup.select('#sponsor')

经过是否存在某个特点来查找,查找具有 id 特点的 li 标签

soup.select('li[id]')

经过特点的值来查找查找,查找 id 为 sponsor 的 li 标签

soup.select('li[id="sponsor"]')

其他

其他的查找办法还有:

find_parents() 和 find_parent()
find_next_siblings() 和 find_next_sibling()
find_previous_siblings() 和 find_previous_sibling()

参数的效果和 find_all()、find() 不同不大,这儿就不再罗列使管家拐到床上来用办法了。这两个办法根本现已能满意绝大部分的查询需求。

还有一些办法触及文档树的修正。关于爬虫来说大部分作业仅仅检索页面的信息,很少需求对页面源码做改动,所以这部分的内容也不再罗列。

详细详细信息可直接参阅Beautiful Soup库的官方阐明文档。