前言
前面安裝了BeautifulSoup庫,現在就來實現一下吧。
目錄
一、Urllib庫的使用
二、BeautifulSoup的使用
三、 一個示例
------------------------------------------------------------------------------------------------------------
正文
一、Urllib庫的使用
看了一些簡單爬蟲的資料,都用到了Urllib庫,想必這也是與web爬取數據的基礎,因此先去看了看Urllib庫的相關內容。
按我自己的理解,爬取網頁的內容其實就是先把頁面的信息先通過Urllib庫抓取到本地,然后再通過BeautifulSoup庫來精細划分抓取得到的頁面內容數據。
使用Urllib庫的最基本方法其實就三行代碼(如下):
# -*- coding: utf-8 -*- import urllib res = urllib.urlopen("http://www.baidu.com") print res.read()
具體解釋:
- urllib庫一般安裝完Python后就自帶在其安裝包里面了,所以直接使用"import urllib"語句就能直接使用了;
- urllib.urlopen(url[, data[, proxies]]) :創建一個表示遠程url的類文件對象,然后像本地文件一樣操作這個類文件對象來獲取遠程數據。
(參數url表示遠程數據的路徑,一般是網址;參數data表示以post方式提交到url的數據)
- urlopen()返回 一個類文件對象(此處用res來獲取該對象),它提供了如下方法:read() , readline() , readlines() , fileno() , close()
- res.read()返回獲取到的網頁內容
最后輸出的內容如下所示(相當於查看網頁源碼看到的內容)
二、BeautifulSoup的使用
在用Urllib庫從網頁上得到了網頁數據后,就要開始使用BeautifulSoup了。
1. 首先創構造一個BeautifulSoup對象
下面有一些最簡單的例子:
(1)通過字符串創建BeautifulSoup對象
# -*- coding: utf-8 -*- from bs4 import BeautifulSoup helloworld = '<p>Hello World</p>' soup_string = BeautifulSoup(helloworld, "html.parser") print soup_string
結果:
(2)通過類文件對象創建BeautifulSoup對象
# -*- coding: utf-8 -*- import urllib from bs4 import BeautifulSoup url = "http://www.baidu.com" page = urllib.urlopen(url) soup = BeautifulSoup(page,"html.parser") print soup
因為前面說的Urllib庫用urlopen()返回的就是一個類文件對象,所以這里的結果和之前Urllib中對象調用read()得到的結果是一樣的。
(3)通過本地文件對象創建BeautifulSoup對象
# -*- coding: utf-8 -*- import urllib from bs4 import BeautifulSoup with open('index.html','r') as foo_file : soup_foo = BeautifulSoup(foo_file, "html.parser") print soup_foo
【注意】以上的三種方法創建BeautifulSoup對象使用的語句是:BeautifulSoup(urllib庫對象名, "html.parser"),其中標紅的部分"html.parser"是我時間之后發現要加的,很多教程里面是直接使用 BeautifulSoup(urllib庫對象名)來創建,但是我運行的時候會有一個warning:
於是就按照提示上說的,加上了"html.parser",運行之后果然正常了,所以如果你也遇到一樣的問題,就還是加上它吧:)
2.使用BeautifulSoup庫的 find()和findAll()函數
在構造好BeautifulSoup對象后,借助find()和findAll()這兩個函數,可以通過標簽的不同屬性輕松地把繁多的html內容過濾為你所想要的。
這兩個函數的使用很靈活,可以: 通過tag的id屬性搜索標簽、通過tag的class屬性搜索標簽、通過字典的形式搜索標簽內容返回的為一個列表、通過正則表達式匹配搜索等等
基本使用格式:
pid = soup.find(attrs={"id":"aa"})
pid = soup.findAll('a',{'class':'sister'})
三. 一個示例
這個示例是我在查找資料的時候看到的,按照代碼運行得出來,理解起來也簡單,因此就借鑒一下
(原文地址:http://www.cnblogs.com/hearzeus/p/5151449.html)
下面是代碼和效果:
# -*- coding: utf-8 -*- import urllib from bs4 import BeautifulSoup res = urllib.urlopen("http://www.douban.com/tag/%E5%B0%8F%E8%AF%B4/?focus=book") soup = BeautifulSoup(res,"html.parser") book_div = soup.find(attrs={"id":"book"}) book_a = book_div.findAll(attrs={"class":"title"}) for book in book_a: print book.string