BeautifulSoup的基本使用(《python网络爬虫权威指南》笔记)

安装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)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值