初识python爬虫 Python网络数据采集1.0 BeautifulSoup安装测试

*文章说明这个学习资料是Ryan Mitchel的著作<Web Scraping with Python: Collecting Data from the Modern Web>我算是一步一步跟着一起去学习。分享自及遇到的问题。总结


*环境说明我使用的是python3.5+python2.7共存。

1.0.1

安装BeautifulSoup

windows

cmd运行下面命令

pip3 install beautifulsoup4

Linux 

sudo apt-get install python-bs4

对于 Mac 系统

首先用

sudo easy_install pip

安装 Python 的包管理器 pip,

然后运行来安装库文件。

pip install beautifulsoup4

另外,如果你的设备同时安装了 Python 2.x 和 Python 3.x,

当你安装包的时候,如果有可能安装到了 Python 2.x 而不是 Python 3.x 里,就需要使用 pip3 安装 Python 3.x 版本的包:

pip3 install beautifulsoup4

pip在两个版本共存出现问题可以参考我的这篇文章python2 和python3 共存 如何使用pip,pip3


你可以在python终端中验证一下是否安装成功

cmd中输入

python3
from bs4 import BeautifulSoup


没有报错证明成功了。

可以做一个简单的尝试

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


这里我有出现warning,并不影响程序第二次就没有了,可以尝试调取其他的函数

print(bsObj.h1)
print(bsObj.html.body.h1)
print(bsObj.html.body.div)

其实考虑到网络与诸多原因,我们这样写代码是不行的,

html = urlopen("http://www.pythonscraping.com/pages/page1.html")

这行代码主要可能会发生两种异常:
1.网页在服务器上不存在(或者获取页面的时候出现错误)

2.服务器不存在(就是说链接 http://www.pythonscraping.com/ 打不开,或者是 URL 链接写错了),

第一种异常发生时,程序会返回 HTTP 错误。HTTP 错误可能是“404 Page Not Found”“500Internal Server Error”等。我们可以用下面的方式处理这种异常

try:
 html = urlopen("http://www.pythonscraping.com/pages/page1.html")
except HTTPError as e:
 print(e)
 # 返回空值,中断程序,或者执行另一个方案
else:
 # 程序继续。注意:如果你已经在上面异常捕捉那一段代码里返回或中断(break),

 # 那么就不需要使用else语句了,这段代码也不会执行

如果程序返回 HTTP 错误代码,程序就会显示错误内容,不再执行 else 语句后面的代码

第二种异常发生时urlopen 会返回一个 None 对象。这个对象与其他编程语言中的 null 类似。我们

可以增加一个判断语句检测返回的 html 是不是 None:

if html is None:
 print("URL is not found")
else:

 # 程序继续

当然了你调取函数的时候也会出现问题,如果你想要调用的标签不存在也会出现问题

如果你想要调用的标签不存在,BeautifulSoup 就会返回 None 对象。不过,如果再调用这个 None 对象下面的子标签,就会发生 AttributeError错误。比如

print(bsObj.bucunzai)


继续调取该标签下的子标签

 print(bsObj.bucunzai.ex)


则出现AttributeError错误。

所以每当你调用 BeautifulSoup 对象里的一个标签时,增加一个检查条件保证标签确实存在。

try:
    badContent = bsObj.nonExistingTag.anotherTag
except AttributeError as e:
    print("Tag was not found")
else:
    if badContent is None:
        print("Tag was not found")
    else:
        print(badContent)

所以写了另一种比较严谨的的实现方式

from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
def getTitle(url):
    try:
     html = urlopen(url)
    except HTTPError as e:
          return None
    try:
        bsObj = BeautifulSoup(html.read())
        title = bsObj.body.h1
    except AttributeError as e :
          return None
    return title
title = getTitle("http://www.pythonscraping.com/pages/page1.html")
if title is None:
    print("Title could not be found")
else:
    print(title)

如果获取网页的时候遇到问题就返回一个 None 对象。在 getTitle 函数里面,我们像前面那样检查了HTTPError,然后把两行 BeautifulSoup 代码封装在一个 try 语句里面。这两行中的任何一行有问题,AttributeError 都可能被抛出(如果服务器不存在,html 就是一个 None 对象,html.read() 就会抛出 AttributeError)。

猜你喜欢

转载自blog.csdn.net/qq_38845164/article/details/80854379