Python网络爬虫——BeautifulSoup4库的使用

使用requests库获取html页面并将其转换成字符串以后,须要进一步解析html页面格式,提取有用信息。html

BeautifulSoup4库,也被成为bs4库(后皆采用简写)用于解析和处理html和xml。python

1.调用web

bs4库中最主要的即是bs类了,每一个实例化的对象都至关于一个html页面json

须要采用from-import导入bs类,同时经过BeautifulSoup()建立一个bs对象spa

代码以下:3d

import requests
from bs4 import BeautifulSoup
r=requests.get("https://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)
print(type(soup))

 

运行结果:code

 

 2.经常使用属性xml

建立的BeautifulSoup对象是一个树形结构,它包含html页面中的每个Tag(标签)元素,能够经过<a>.<b>的形式得到htm

常见的属性以下:对象

head:

html页面<head>内容

title:

html页面标题,在<head>之中,由<title>标记

body:

html页面<body>内容

p:

html页面第一个<p>内容

strings:

html页面全部呈如今web上的字符串,即标签的内容

stripped_string:

html页面全部呈如今web上的非空字符串

 

 

接下来尝试爬取百度的标语“百度一下,你就知道”

首先咱们经过requests来创建请求,能够经过查看源代码找到对应部分

以下所示:

 

 因此直接经过调用<title>标签便可

代码以下:

import requests
from bs4 import BeautifulSoup
r=requests.get("https://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)
title=soup.title
print(title)

 

结果如图所示:

 

  3.标签经常使用属性

每个标签在bs4中也是一个对象,被称为tag对象,以糯米为例,常见结构以下:

<a class=“mnav” href="http://www.nuomi.com">糯米</a>

其中尖括号(<>)中标签的名字为 name,其余项为attrs,尖括号之间的内容为string

因此常见的标签属性分为4种

name:

字符串、标签的名字

attrs:

字典、包含了原来页面tag的全部属性,好比href

contrnts:

列表、tag下全部子tag的内容

string:

字符串、tag所包含的文本,网页中的真实文字

 

因为html能够在标签中嵌套其余的标签,因此string返回遵循如下原则

①若是标签内没有其余标签,string属性返回其中的内容

②若是标签内部还有标签,但只有一个标签,string返回最里面的标签内容

③若是内部超过1层嵌套标签,则返回为none

 

依然以百度为例,咱们须要找到第一个<a>标签的string代码应当以下:

import requests
from bs4 import BeautifulSoup
r=requests.get("https://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)
print(soup.a.string)

 

结果如图所示:

 

 4.调用find()与find_all()

html中,同一个特标签会有不少内容,好比百度首页<a>一共有13处,但值返回第一处

因此这时候须要经过find与find_all来寻找,这两个方法都会遍历html文档按照条件返回内容

使用方法以下:

BeautifulSoup.find_all(name,attrs,recursive,string,limit)

name:以标签名字进行搜索,名字用字符串类型表示

attrs:按照标签的属性来搜索,须要列出属性的名字和值,用json方法表示

recursive:设置查找层次,只查找当前标签的西一层时使用recursiv=false

string:按照关键字查找string属性内容,采用string=开始

limit:返回结果个数,默认所有

至于find()使用方法如find_all()相同,

BeautifulSoup.find_all(name,attrs,recursive,string)

区别在于find()只搜索第一个结果,find_all()返回全部结果。

 

咱们尝试来经过find_all()来获取全部含有“百度”这一关键词的标签

首先须要调用re库,re是python的标准库能够采用compile()对字符串的检索

因此代码以下:

import requests
import re
from bs4 import BeautifulSoup
r=requests.get("https://www.baidu.com/")
r.encoding="utf-8"
soup=BeautifulSoup(r.text)
w=soup.find_all(string=re.compile("百度"))
print(w)

 

结果以下:

相关文章
相关标签/搜索