BeautifulSoup的基本使用
安装BeautifulSoup(windows系统)
直接使用包管理器pip来安装,打开命令提示行,输入:
pip install beautifulsoup4
即可自动安装,如果由于网络原因导致安装失败或者安装速度慢,可以使用豆瓣源进行安装:
pip install -i https://pypi.douban.com/simple beautifulsoup4
之后可以在pycharm中尝试导入,如果导入成功,则说明安装成功了:
from bs4 import BeautifulSoup
BeautifulSoup简单使用
现在我们可以尝试使用BeautifulSoup获取一个网页的h1标签,见下面的代码:
from bs4 import BeautifulSoup
from urllib.request import urlopen
html = urlopen("http://www.pythonscraping.com/pages/page1.html")
#访问目标url
bs = BeautifulSoup(html.read(),"html.parser")
print(bs.h1)
对上面的代买进行以下的说明:
- 这里我们访问网页中的h1标签,即可以使用bs.h1也可以使用bs.body.h1(相当于body标签下的h1子标签)。
- BeautifulSoup函数的第一个参数html.read()表示访问的html源代码,相当于我们使用右键->查看网页源代码。
- 第二个参数是用于创建BeautifulSoup对象时所用的解析器,html.parser是python自带的,大多数情况下使用解析器不同差别不是很大
当然我们还可以使用其他的解析器,比如lxml,其拥有更快的解析速度,并且在解析杂乱或者有错误的的HTML代码上更有优势,缺点使我们需要进行下载,并且使用它需要C语言库:
pip install -i https://pypi.douban.com/simple lxml
之后使用lxml解析器的时候,只需要:
bs = BeautifulSoup(html.read(),"lxml")
#不需要import
另外一个常用的解析器是html5lib,它仍然需要我们自行进行安装,它可以容忍更糟糕的HTML语法,但是它的解析速度比html.parser和lxml都慢。
使用BeautifulSoup时常见的错误
首先是第一个常见错误:网页在服务器上不存在。该错误会在执行urlopen所在的行时发生,表示在目标服务器上不能找到相应的网页。此时会抛出HTTPError异常。
第二个常见错误:服务器不存在。该错误也会在执行urlopen所在的行时发生,可能是因为服务器域名填写错误或者服务器处于离线状态,此时会抛出URLError异常。
之后倘若我们成功获取到了想要的html文件,但仍然可能在获取标签的过程中出现错误。比如,在我们想要获取一个标签的时候,如果该标签并不存在,则会返回None,如果我们想要返回这个不存在的标签的子标签的时候,则会报错,此时会发生AttributeError。
为了避免这些经常出现的错误,我们在读取某个标签比如h1标签的时候,则可以自己定义一个函数,在进行获取标签的时候先进行可能的错误的排查:
from bs4 import BeautifulSoup
from urllib.request import urlopen
from urllib.error import HTTPError
def getTittle(url):
"""
:param url: 目标网页的url
:return: 该网页的h1标签,若该网页或者h1标签不存在则返回None
"""
try:
html = urlopen(url)
#获取html
except HTTPError as e:
return None
#倘若网页在服务器上不存咋I,则返回None
try:
bs = BeautifulSoup(html.read(),"lxml")
title = bs.body.h1
except AttributeError as e:
return None
#若标签不存在,或者服务器不存在,则会返回None
return title
title = getTittle("http://www.pythonscraping.com/pages/page1.html")
#获取目标网页的title
if title == None:
print("Title could not be found")
else:
print(title)