1. 程式人生 > >使用Python中的HTMLParser、cookielib抓取和解析網頁、從HTML文件中提取連結、影象、文字、Cookies .

使用Python中的HTMLParser、cookielib抓取和解析網頁、從HTML文件中提取連結、影象、文字、Cookies .

對搜尋引擎、檔案索引、文件轉換、資料檢索、站點備份或遷移等應用程式來說,經常用到對網頁(即HTML檔案)的解析處理。事實上,通過 Python語言提供的各種模組,我們無需藉助Web伺服器或者Web瀏覽器就能夠解析和處理HTML文件。本文上篇中,我們介紹了一個可以幫助簡化開啟 位於本地和Web上的HTML文件的Python模組。在本文中,我們將論述如何使用Python模組來迅速解析在HTML檔案中的資料,從而處理特定的 內容,如連結、影象和Cookie等。同時還會介紹如何規範HTML檔案的格式標籤。

  一、從HTML文件中提取連結

  Python語言還有一個非常有用的模組HTMLParser,該模組使我們能夠根據HTML文件中的標籤來簡潔、高效地解析HTML文件。所以,在處理HTML文件的時候,HTMLParser是最常用的模組之一。

import HTMLParser

  
import urllib

  
class parseLinks(HTMLParser.HTMLParser):

  
def handle_starttag(self, tag, attrs):

  
if tag =='a':

  
for name,value in attrs:

  
if name =='href
':

  
print value

  
print self.get_starttag_text()

  lParser 
= parseLinks()

  lParser.feed(urllib.urlopen(
"http://www.python.org/index.html").read())

  處理HTML文件的時候,我們常常需要從其中提取出所有的連結。使用HTMLParser模組後,這項任務將變得易如反掌。首先,我們需要定義 一個新的HTMLParser類,以覆蓋handle_starttag()方法,我們將使用這個方法來顯示所有標籤的HRef屬性值。

  定義好新的HTMLParser類之後,需要建立一個例項來返回HTMLParser物件。然後,就可以使用urllib.urlopen(url)開啟HTML文件並讀取該HTML檔案的內容了。

  為了解析HTML檔案的內容並顯示包含其中的連結,可以使用read()函式將資料傳遞給HTMLParser物件。HTMLParser物件 的feed函式將接收資料,並通過定義的HTMLParser物件對資料進行相應的解析。需要注意,如果傳給HTMLParser的feed()函式的數 據不完整的話,那麼不完整的標籤會儲存下來,並在下一次呼叫feed()函式時進行解析。當HTML檔案很大,需要分段傳送給解析器的時候,這個功能就會 有用武之地了。下面是一個具體的例子

import HTMLParser

  
import urllib

  
import sys

  
#定義HTML解析器class
 parseLinks(HTMLParser.HTMLParser):

  
def handle_starttag(self, tag, attrs):

  
if tag =='a':

  
for name,value in attrs:

  
if name =='href':

  
print value

  
print self.get_starttag_text()

  
#建立HTML解析器的例項
  lParser 
= parseLinks()

  
#開啟HTML檔案
  lParser.feed(urllib.urlopen( /

  
"http://www.python.org/index.html").read())

  lParser.close()

  上述程式碼的執行結果太長,在此省略,您可以自己執行程式碼試試。

二、從HTML文件中提取影象

  處理HTML文件的時候,我們常常需要從其中提取出所有的影象。使用HTMLParser模組後,這項任務將變得易如反掌。首先,我們需要定義 一個新的HTMLParser類,以覆蓋handle_starttag()方法,該方法的作用是查詢img標籤,並儲存src屬性值所指的檔案。

import HTMLParser

  
import urllib

  
def getImage(addr):

  u 
= urllib.urlopen(addr)

  data 
= u.read()

  
class parseImages(HTMLParser.HTMLParser):

  
def handle_starttag(self, tag, attrs):

  
if tag =='img':

  
for name,value in attrs:

  
if name =='src':

  getImage(urlString 
+"/"+ value)

  u 
= urllib.urlopen(urlString)

  lParser.feed(u.read())

  定義好新的HTMLParser類之後,需要建立一個例項來返回HTMLParser物件。然後,就可以使用urllib.urlopen(url)開啟HTML文件並讀取該HTML檔案的內容了。

  為了解析HTML檔案的內容並顯示包含其中的影象,可以使用feed(data)函式將資料傳送至HTMLParser物件。HTMLParser物件的feed函式將接收資料,並通過定義的HTMLParser物件對資料進行相應的解析。下面是一個具體的示例:

import HTMLParser

  
import urllib

  
import sys

  urlString 
="http://www.python.org"#把影象檔案儲存至硬碟def getImage(addr):

  u 
= urllib.urlopen(addr)

  data 
= u.read()

  splitPath 
= addr.split('/')

  fName 
= splitPath.pop()

  
print"Saving %s"% fName

  f 
= open(fName, 'wb')

  f.write(data)

  f.close()

  
#定義HTML解析器class parseImages(HTMLParser.HTMLParser):

  
def handle_starttag(self, tag, attrs):

  
if tag =='img':

  
for name,value in attrs:

  
if name =='src':

  getImage(urlString 
+"/"+ value)

  
#建立HTML解析器的例項
  lParser 
= parseImages()

  
#開啟HTML檔案
  u 
= urllib.urlopen(urlString)

  
print"Opening URL/n===================="print u.info()

  
#把HTML檔案傳給解析器
  lParser.feed(u.read())

  lParser.close()

  上述程式碼的執行結果如下所示:

  Opening URL

  
====================

  Date: Fri, 
26 Jun 200910:54:49 GMT

  Server: Apache
/2.2.9 (Debian) DAV/2 SVN/1.5.1 mod_ssl/2.2.9 OpenSSL/0.9.8g mod_wsgi/2.3 Python/2.5.2

  Last
-Modified: Thu, 25 Jun 2009 09:44:54 GMT

  ETag: 
"105800d-46e7-46d29136f7180"

  Accept
-Ranges: bytes

  Content
-Length: 18151

  Connection: close

  Content
-Type: text/html

  Saving python
-logo.gif

  Saving trans.gif

  Saving trans.gif

  Saving afnic.fr.png

 三、從HTML文件中提取文字

  處理HTML文件的時候,我們常常需要從其中提取出所有的文字。使用HTMLParser模組後,這項任務將變得非常簡單了。首先,我們需要定義一個新的HTMLParser類,以覆蓋handle_data()方法,該方法是用來解析並文字資料的。

import HTMLParser

  
import urllib

  
class parseText(HTMLParser.HTMLParser):

  
def handle_data(self, data):

  
if data !='/n':

  urlText.append(data)

  lParser 
= parseText()

  lParser.feed(urllib.urlopen( /

  http:
//docs.python.org/lib/module-HTMLParser.html).read())

  定義好新的HTMLParser類之後,需要建立一個例項來返回HTMLParser物件。然後,就可以使用urllib.urlopen(url)開啟HTML文件並讀取該HTML檔案的內容了。

  為了解析HTML檔案的內容並顯示包含其中的文字,我們可以使用feed(data)函式將資料傳遞給HTMLParser物件。 HTMLParser物件的feed函式將接收資料,並通過定義的HTMLParser物件對資料進行相應的解析。要注意的是,如果傳給 HTMLParser的feed()函式的資料不完整的話,那麼不完整的標籤會儲存下來,並在下一次呼叫feed()函式時進行解析。當HTML檔案很 大,需要分段傳送給解析器的時候,這個功能就會有用武之地了。下面是一個具體的程式碼示例:

import HTMLParser

  
import urllib

  urlText 
= []

  
#定義HTML解析器class parseText(HTMLParser.HTMLParser):

  
def handle_data(self, data):

  
if data !='/n':

  urlText.append(data)

  
#建立HTML解析器的例項
  lParser 
= parseText()

  
#把HTML檔案傳給解析器
  lParser.feed(urllib.urlopen( /

  “http:
//docs.python.org/lib/module-HTMLParser.html” /

  ).read())

  lParser.close()

  
for item in urlText:

  
print item

  上面程式碼的執行輸出過長,在此略過

四、從HTML文件中提取Cookies

  很多時候,我們都需要處理Cookie,幸運的是Python語言的cookielib模組為我們提供了許多自動處理在HTML中的HTTP Cookie的類。當處理要求為客戶端設定Cookie的HTML文件的時候,這些類對我們非常有用。

import urllib2

  
import cookielib

  
from urllib2 import urlopen, Request

  cJar 
= cookielib.LWPCookieJar()

  opener
=urllib2.build_opener( /

  urllib2.HTTPCookieProcessor(cJar))

  urllib2.install_opener(opener)

  r 
= Request(testURL)

  h 
= urlopen(r)

  
for ind, cookie in enumerate(cJar):

  
print"%d - %s"% (ind, cookie)

  cJar.save(cookieFile)

  為了從HTML文件提取cookies,首先得使用cookielib模組的LWPCookieJar()函式建立一個cookie jar的例項。LWPCookieJar()函式將返回一個物件,該物件可以從硬碟載入Cookie,同時還能向硬碟存放Cookie。

  接下來,使用urllib2模組的build_opener([handler, . . .])函式建立一個opener物件,當HTML檔案開啟時該物件將處理cookies。函式build_opener可以接收零個或多個處理程式(這些 程式將按照它們被指定的順序連線在一起)作為引數並返回一個。

  注意,如果想讓urlopen()使用opener物件來開啟HTML檔案的話,可以呼叫install_opener(opener)函式,並將opener物件傳給它。否則,請使用opener物件的open(url)函式來開啟HTML檔案。

  一旦已經建立並安裝了opener物件,就可以使用urllib2模組中的Request(url)函式來建立一個Request物件,然後就能使用urlopen(Request)函式來開啟HTML檔案了。

  開啟HTML頁面後,該頁面的所有Cookie將被存放到LWPCookieJar物件中,之後,您可以使用LWPCookieJar物件的save(filename)函數了。

import os

  
import urllib2

  
import cookielib

  
from urllib2 import urlopen, Request

  cookieFile 
="cookies.dat"

  testURL 
='http://maps.google.com/'#為cookie jar 建立例項
  cJar 
= cookielib.LWPCookieJar()

  
#建立HTTPCookieProcessor的opener物件
  opener 
= urllib2.build_opener( /

  urllib2.HTTPCookieProcessor(cJar))

  
#安裝HTTPCookieProcessor的opener
  urllib2.install_opener(opener)

  
#建立一個Request物件
  r 
= Request(testURL)

  
#開啟HTML檔案
  h 
= urlopen(r)

  
print"頁面的頭部/n======================"print h.info()

  
print"頁面的Cookies/n======================"for ind, cookie in enumerate(cJar):

  
print"%d - %s"% (ind, cookie)

  
#儲存cookies
  cJar.save(cookieFile)

  上述程式碼的執行結果如下所示:

  頁面的頭部

  
======================

  Cache
-Control: private

  Content
-Type: text/html; charset=ISO-8859-1

  Set
-Cookie: PREF=ID=5d9692b55f029733:NW=1:TM=1246015608:LM=1246015608:S=frfx--b3xt73TaEA; expires=Sun, 26-Jun-201111:26:48 GMT; path=/; domain=.google.com

  Date: Fri, 
26 Jun 200911:26:48 GMT

  Server: mfe

  Expires: Fri, 
26 Jun 200911:26:48 GMT

  Transfer
-Encoding: chunked

  Connection: close

  頁面的Cookies

  
======================

  0 
-

 五、為HTML文件中的屬性值新增引號

  前面我們討論瞭如果根據HTML解析器中的某種處理程式來解析HTML檔案,可是有時候我們卻需要使用所有的處理程式來處理HTML文件。值得慶幸的是,使用HTMLParser模組解析HTML檔案的所有要素並不比處理連結或者影象難多少。

import HTMLParser

  
import urllib

  
class parseAttrs(HTMLParser.HTMLParser):

  
def handle_starttag(self, tag, attrs):

  . . .

  attrParser 
= parseAttrs()

  attrParser.init_parser()

  attrParser.feed(urllib.urlopen(
"test2.html").read())

  這裡,我們將討論如何使用HTMLParser模組來解析HTML檔案,從而為“裸奔”的屬性值加上引號。首先,我們要定義一個新的HTMLParser類,以覆蓋下面所有的處理程式來為屬性值新增引號。

  handle_starttag(tag, attrs)

  handle_charref(name)

  handle_endtag(tag)

  handle_entityref(ref)

  handle_data(text)

  handle_comment(text)

  handle_pi(text)

  handle_decl(text)

  handle_startendtag(tag, attrs)

  我們還需要在parser類中定義一個函式來初始化用於儲存解析好的資料的變數,同時還要定義另外一個函式來返回解析好的資料。

  定義好新的HTMLParser類之後,需要建立一個例項來返回HTMLParser物件。使用我們建立的init函式初始化該解析器,這樣,我們就可以使用urllib.urlopen(url)開啟HTML文件並讀取該HTML檔案的內容了。

  為了解析HTML檔案的內容並給屬性值新增引號,可以使用feed(data)函式將資料傳遞給HTMLParser物件。HTMLParser物件的feed函式將接收資料,並通過定義的HTMLParser物件對資料進行相應的解析。下面是一個具體的示例程式碼:

import HTMLParser

  
import urllib

  
import sys

  
#定義HTML解析器class parseAttrs(HTMLParser.HTMLParser):

  
def init_parser (self):

  self.pieces 
= []

  
def handle_starttag(self, tag, attrs):

  fixedAttrs 
=""#for name,value in attrs:for name, value in attrs:

  fixedAttrs 
+="%s=/"%s/" "% (name, value)

  self.pieces.append(
"<%s %s>"% (tag, fixedAttrs))

  
def handle_charref(self, name):

  self.pieces.append(
"&#%s;"% (name))

  
def handle_endtag(self, tag):

  self.pieces.append(
""% (tag))

  
def handle_entityref(self, ref):

  self.pieces.append(
"&%s"% (ref))

  
def handle_data(self, text):

  self.pieces.append(text)

  
def handle_comment(self, text):

  self.pieces.append(
""% (text))

  
def handle_pi(self, text):

  self.pieces.append(
""% (text))

  
def handle_decl(self, text):

  self.pieces.append(
""% (text))

  
def parsed (self):

  
return"".join(self.pieces)

  
#建立HTML解析器的例項
  attrParser 
= parseAttrs()

  
#初始化解析器資料
  attrParser.init_parser()

  
#把HTML檔案傳給解析器
  attrParser.feed(urllib.urlopen(
"test2.html").read())

  
#顯示原來的檔案內容print"原來的檔案/n========================"print open("test2.html").read()

  
#顯示解析後的檔案print"解析後的檔案/n========================"print attrParser.parsed()

  attrParser.close()

  我們還需要建立一個測試檔案,名為test2.html,該檔案內容可以從上述程式碼的執行結果看到,具體如下所示:

原來的檔案
========================<html><head><meta content="text/html; charset=utf-8"
http
-equiv="content-type"/><title>Web頁面</title></head><body><H1>Web頁面清單</H1><a href=http://www.python.org>Python網站</a><a href=test.html>本地頁面</a><img SRC=test.jpg></body></html>

解析後的檔案
========================<html><head ><meta content="text/html; charset=utf-8"
http
-equiv="content-type"></meta><title >Web頁面</title></head><body ><h1 >Web頁面清單</h1><a href="http://www.python.org">Python網站</a><a href="test.html">本地頁面</a><img src="test.jpg"></body></html>

  六、小結

  對搜尋引擎、檔案索引、文件轉換、資料檢索、站點備份或遷移等應用程式來說,經常用到對網頁(即HTML檔案)的解析處理。事實上,通過 Python語言提供的各種模組,我們無需藉助Web伺服器或者Web瀏覽器就能夠解析和處理HTML文件。本文將詳細介紹瞭如何使用Python模組來 迅速解析在HTML檔案中的資料,從而處理特定的內容,如連結、影象和Cookie等。同時,我們還給出了一個規範HTML檔案的格式標籤的例子,希望本 文對您會有所幫助。

相關推薦

使用PythonHTMLParsercookielib解析網頁HTML提取連結影象文字Cookies .

對搜尋引擎、檔案索引、文件轉換、資料檢索、站點備份或遷移等應用程式來說,經常用到對網頁(即HTML檔案)的解析處理。事實上,通過 Python語言提供的各種模組,我們無需藉助Web伺服器或者Web瀏覽器就能夠解析和處理HTML文件。本文上篇中,我們介紹了一個可以幫助簡化開啟

Python網路爬蟲實戰:分析天貓胸罩銷售資料

本文實現一個非常有趣的專案,這個專案是關於胸罩銷售資料分析的。Google曾給出了一幅世界女性胸部尺寸分佈地圖 ,從地圖中可以明顯看出中國大部分地區呈現綠色(表示平均胸部尺寸為A罩杯),少部分地區呈現藍色(表示平均胸部尺寸為B罩杯) 現在李寧老師也來驗證一下這個

c#使用 HtmlAgilityPack來進行解析來獲得table表格資訊

專案上要用到抓取網頁,最後選用了HtmlAgilityPack來進行。 官網地址:https://html-agility-pack.net/,可以看一下 基礎的: // From File var doc = new HtmlDocument(); doc.Load(filePath); // Fr

解析網頁資料(xml解析html解析

網頁有兩種格式,一種是xml另一種是html,目前似乎好像大部分都是html格式的,檢視網頁格式的方法是在瀏覽器中右鍵–>檢視原始碼或者直接F12即可。 一、XML解析 1)DOM解析 DOM(Document Object Mode)是

使用SharedPreferences將姓名年齡信息保存在,並讀取信息

new sta text str @override this ket make and 第一個是XML文件: 1 <?xml version="1.0" encoding="utf-8"?> 2 <LinearLayout xmlns:androi

利用Fiddler2的Custom Rules自動App的TOKEN並記錄到

測試結果 style key ref 啟動 nbsp 分享圖片 modify clip 本文原創作者:鯤之鵬(http://www.site-digger.com)本文原始鏈接:http://www.site-digger.com/html/articles/2017081

python+selenium常見例項-如何TXT讀取使用者資訊

1、分開成每一條,然後轉化成字典 confg=open的檔案 for line in config: 每行進行分割---------例如下面,根據=分割,並且列表解析,防止有回車 result=【ele.strip( ) for ele in line.split

爬蟲--使用scrapy爬糗事百科並在txt持久化存儲

max color 圖片 得到 acc deb ould ins ant 工程目錄結構  spiders下的first源碼    # -*- coding: utf-8 -*- import scrapy from firstBlood.items imp

python3 簡單實現csv讀取內容,並對內容進行分類統計

tmp spa writer ict 打開文件 while 類型 spl blog 新手python剛剛上路,在實際工作中遇到如題所示的問題,嘗試使用python3簡單實現如下,歡迎高手前來優化import csv #打開文件,用with打開可以不用去特意關閉file了

pdf 抽取特定的頁面

mac rar sql 我們 lib cal use page star 前段時間買了一個kindle 電子書閱讀器、我想用它來讀的pdf文檔、當然最主要是用來讀python標準庫&mysql的官方文檔。 問題就來了、這兩個都是大頭書、之前用mac看還好、用kind

解決json獲取不到數據的問題

app 一個數 你是 項目 clas control cor solid 例子    在寫項目時我們需要數據渲染,在渲染的過程中有時會發現有些數據一直渲染不到頁面上;  解決此問題我總結了一下幾點   1、首先先查找自己的json文件路徑是否正確,      錯誤示範

Excel讀取內容

default request .so length sed load pre open() else 從Excel文件中讀取內容        global::System.Web.HttpPostedFileBase file = Request.Files["txt

Matlab讀取mxArray類型變量-部分代碼分析

strcmp tla 輸入 printf 分代 目標 char n-1 () 這是我做的筆記,看到這個代碼時覺得處理有點妙,做筆記記錄之。 部分源代碼: 。。。。 int main(int argc,char** argv) {   char name[_FILE_NAME

html引入html

load() blog 方式 height div query gpo 文件 () 一般用於網站提取公共部分的導航欄等 第一種方式:<iframe>標簽 在body標簽第一行加<iframe>標簽 <body> <ifram

配置刪除節點

web 配置 rem code config mstr mov pan asc private List<string> _ignoreList; private void InitIgnoreList()

一個讀取數據到內存,然後再把內存的數據寫入另外一個

錯誤代碼 就會 取數據 stream off err sig where 返回值 //從一個文件中讀取數據到內存,然後再把內存中的數據寫入另外一個文件 #include "stdafx.h"#include "stdlib.h" in

HTMLclass名以及id名的命名規則

注意:命名不要以數字開始 瞭解class與id區別及用法 命名寫法: 1. 每個單詞中間以“_”隔開 #main_left_box{} 2. 駝峰命名 從第二個單詞開始每個單詞的首字母大寫  #mainLeftBox{} 3. 用包含選擇器,定義元素時候能找到這個元素並且不

Golang 爬蟲-廣度優先(獲取html的超連結

package main import( "fmt" "net/http" "io/ioutil" "regexp" "strings" ) var href_reg *regexp.Regexp var hrefs_been_found map[string]i

HTMl使用CSS

內聯樣式 <!DOCTYPE html> <html> <!-- CSS建立(讓CSS樣式表作用於文件) 外部樣式表: 當樣式需要應用於

pb恢復計算圖並在tensorboard展示

計算 oar home out http fas writer cin 轉換 因為訓練的時候偷懶沒有定義output node,所以在模型轉換這一步就遇到了麻煩。因為不知道output node name,又不想重新訓練,只能從tensorboard中尋找節點的名字。因為我