1. 程式人生 > >Python3爬蟲從入門到自殘(二):HTML及其解析

Python3爬蟲從入門到自殘(二):HTML及其解析

一.HTML標記語言基礎

要從網頁中抽取資料出來,那麼瞭解HTML標記語言是很重要的,但是這個系列的部落格並不是要專門講HTML的,所以,不會講過多的HTML的細節.對於很熟悉HTML的人就不說啦,對於不熟悉HTML語言的同學,這裡推薦一個教程,精簡,方便查閱.HTML 教程
也就是說,之後的所有操作都是預設大家有HTML的一些知識的.

二.BeautifulSoup常見API

對於一個Beautiful物件,經常用到的兩個函式是find()findAll()函式,下面講解一下這兩個函式的原型和一些用法。
Beautiful Soup官方文件

Ⅰ.find_all()

函式原型:
find_all( name , attrs , recursive , text , **kwargs

)

作用:find_all()方法搜尋當前tag的所有tag子節點,並判斷是否符合過濾器的條件.
引數:

  • name:查詢所有名字為 name 的tag,字串物件會被自動忽略掉.
  • attrs:用python字典封裝一個標籤的若干屬性和這些屬性分別對應的值。
  • recursive:布林變數,一般來說,find_all()方法會檢索當前tag的所有子孫結點。因為recursive預設是True

接下里講例子,這個例子使用的網頁是《python資料採集》這本書提供的網頁。我覺得還可以,就用這個網頁作為例子。
War and Peace
這裡寫圖片描述
網頁的原始碼是這個樣子:
這裡寫圖片描述

例一:name引數使用

import
urllib.request import urllib.parse import urllib.error import urllib.response from bs4 import BeautifulSoup request=urllib.request.Request(url="http://www.pythonscraping.com/pages/warandpeace.html") response=urllib.request.urlopen(request) bs=BeautifulSoup(response.read()) namelist=bs.find_all(name="h1"
) print(namelist) print("type of name list:",type(namelist))

這裡寫圖片描述
在這個例子裡面,傳遞的名字(標籤)就只有h1,namelist=bs.find_all(name="h1") 然後這個語句的作用就是在當前的tag(這裡的tag是html)下面找所有的(子標籤以及不停遞迴下去,名字滿足就行)h1 標籤的元素,返回預設是存在一個列表裡面的,意味著你能夠查詢多個tag。比如上面這個就返回了原始碼的h1.

例二.attrs的使用
我們現在想從這個網頁上面找到所有綠色字型的部分,應該怎麼找呢?首先看一下粗略看一下網站的原始碼,發現一個規律,就是顏色的資訊與span這個標籤關聯。所以,我們只要找到span這個標籤,傳入相應的屬性就行了。

import urllib.request
import urllib.parse
import urllib.error
import urllib.response
from bs4 import BeautifulSoup

request=urllib.request.Request(url="http://www.pythonscraping.com/pages/warandpeace.html")
response=urllib.request.urlopen(request)
bs=BeautifulSoup(response.read())
namelist=bs.find_all(name="span",attrs={"class":"green"})
for name in namelist:
    print(name)

結果:
這裡寫圖片描述

從原來的網頁和接過來看,確實是成功了,事實上,也就加了一個引數而已。
Ⅱ.

三.正則表示式

首先正則表示式的基礎以及想讓你預設通過python使用正則表示式請參看,這裡只是直接用正則表示式來完整爬蟲功能。
正則表示式有什麼用呢?下面通過一個例子來說明。
先給出一個圖片網站的網頁:
現代科技圖片
開啟之後是這個樣子。
這裡寫圖片描述
我現在想得到這個網頁中所有展示的圖片的連結應該怎麼辦呢?
很簡單,首先看網站的原始碼
這裡寫圖片描述
粗略的看了一下,圖片檔案都可以通過搜尋img這個標籤來找到。那麼就好辦了。之前例子的程式碼幾乎可以不加改動的用到這裡來,只需要改一點其中的引數的值就行。
程式碼:

import urllib.request
import urllib.parse
import urllib.error
import urllib.response
from bs4 import BeautifulSoup

request=urllib.request.Request(url="http://www.nipic.com/photo/xiandai/index.html")
response=urllib.request.urlopen(request)
bs=BeautifulSoup(response.read())
namelist=bs.find_all(name="img")
for name in namelist:
    print(name)

這裡寫圖片描述
得到的結果不差,想要的圖片的連結都得到了。但是,最後面的幾個連結是什麼鬼。後面的幾個連結是我並不想要的。你當然可以把所有的連結都得到,然後手動去掉。但是為什麼要手動呢?
所以這個時候就要找規律了。其實你一眼看過去,正文圖片的連結都是很有規律工整的,所以這裡就可以直接用到正則表示式啦。
直接看結果的連結規律,我們就可以構造這樣一個正則表示式:

http:\/\/img80\.nipic\.com\/file\/.+\/.+\.jpg

程式碼:

import urllib.request
import urllib.parse
import urllib.error
import urllib.response
from bs4 import BeautifulSoup
import re

request=urllib.request.Request(url="http://www.nipic.com/photo/xiandai/index.html")
response=urllib.request.urlopen(request)
bs=BeautifulSoup(response.read())
namelist=bs.find_all(name="img",attrs={"src":re.compile("http\:\/\/img80\.nipic\.com\/file\/.+\/.+\.jpg")})
for name in namelist:
    print(name)

結果:
這裡寫圖片描述
就成功啦。是不是很簡單。

相關推薦

Python3爬蟲入門HTML及其解析

一.HTML標記語言基礎 要從網頁中抽取資料出來,那麼瞭解HTML標記語言是很重要的,但是這個系列的部落格並不是要專門講HTML的,所以,不會講過多的HTML的細節.對於很熟悉HTML的人就不說啦,對於不熟悉HTML語言的同學,這裡推薦一個教程,精簡,方便查閱.

python爬蟲入門到放棄爬蟲的原理

在上文中我們說了:爬蟲就是請求網站並提取資料的自動化程式。其中請求,提取,自動化是爬蟲的關鍵!下面我們分析爬蟲的基本流程爬蟲的基本流程發起請求通過HTTP庫向目標站點發起請求,也就是傳送一個Request,請求可以包含額外的header等資訊,等待伺服器響應獲取響應內容如果伺服器能正常響應,會得到一個Resp

Linux入門到適應更換清華源

1 進入到/etc/apt資料夾當中,找到sources.list,將其備份。命令:cp -p sources.list sources.list.old 2 採用管理員方式開啟sources.list: sudo vim sources.list 3 在清華源網站上https://mirror.tuna

TensorFlow 入門到精通MNIST 例程原始碼分析

按照上節步驟, TensorFlow 預設安裝在 /usr/lib/python/site-packages/tensorflow/ (也有可能是 /usr/local/lib……)下,檢視目錄結構: # tree -d -L 3 /usr/lib/pyt

Python爬蟲入門到放棄爬蟲與反爬蟲大戰

相對 一個 log 識別 誰是 pytho logs 京東 自動 原文地址https://www.cnblogs.com/zhaof/p/7326260.html 爬蟲與發爬蟲的廝殺,一方為了拿到數據,一方為了防止爬蟲拿到數據,誰是最後的贏家? 重新理解爬蟲中的一些概念 爬

Python爬蟲入門到放棄十三之 Scrapy的中間件Downloader Middleware實現User-Agent隨機切換

cls sta @class The agen github tle 好的 RoCE 原文地址https://www.cnblogs.com/zhaof/p/7345856.html 總架構理解Middleware 通過scrapy官網最新的架構圖來理解: 這個圖

Python爬蟲入門到放棄十四之 Scrapy登錄知乎

提示 mac 重要 瀏覽器 com fin 傳遞 問題 turn 原文地址https://www.cnblogs.com/zhaof/p/7406482.html 因為現在很多網站為了限制爬蟲,設置了為只有登錄才能看更多的內容,不登錄只能看到部分內容,這也是一種反爬蟲的手段

Python爬蟲入門到放棄十一之 Scrapy分布式部署

安裝 abc package .com 調度 fault 官方 python3 ocs 原文地址https://www.cnblogs.com/zhaof/p/7308865.html 按照上一篇文章中我們將代碼放到遠程主機是通過拷貝或者git的方式,但是如果考慮到我們又多

python爬蟲入門到放棄之 正則的基本使用

語言 代碼例子 name 添加 iter ima 制表符 imp things 什麽是正則表達式 正則表達式是對字符串操作的一種邏輯公式,就是 事先定義好的一些特定字符、及這些特定字符的組合,組成一個“規則字符”,這個“規則字符” 來表達對字符的一種過濾邏輯。 正則並不是

python爬蟲入門到放棄之 BeautifulSoup庫的使用

src 表達 支持 正則表達 必須 這樣的 com 子節點 prettify 上一篇文章的正則,其實對很多人來說用起來是不方便的,加上需要記很多規則,所以用起來不是特別熟練,而這節我們提到的beautifulsoup就是一個非常強大的工具,爬蟲利器。 beautifulS

python爬蟲入門到放棄之 Selenium庫的使用

自動 .com 程序 png 都是 例子 等待 點擊 哪些 一、什麽是Selenium selenium 是一套完整的web應用程序測試系統,包含了測試的錄制(selenium IDE),編寫及運行(Selenium Remote Control)和測試的並行處理(Sele

Python爬蟲入門到放棄十三之 Scrapy框架的命令行詳解

directory xpath idf 成了 spider i386 名稱 4.2 不同的 這篇文章主要是對的scrapy命令行使用的一個介紹 創建爬蟲項目 scrapy startproject 項目名例子如下: localhost:spider zhaofan$ sc

反射入門到精通

char tostring import host res substring bject getc i++ 1. 通過反射動態生成SQL語句 Customer.java package com.xuzhiwen.reflect; public class Custom

Docker入門到實戰

Docker 虛擬化 一步一步走,寫小白都能看懂的文章,將持續更新中,敬請期待!Docker從入門到實戰(二)一:什麽是dockerDocker是一個開源的應用容器引擎,開發者可以打包他們的應用以及依賴包到一個可移植的容器中,然後發布到主流的Linux、macOS、Windows機器上,實現虛擬化。D

node.js入門到放棄

簡單的 all == ons true nts 數值 定時 註冊 上章講了學習node,應該去學習什麽,對這些框架去進行學習現在咋們聊聊如何用原生來進行操作 主要來講一下events-事件觸發器 先來講一個簡單的實例 EventEmitter的實例,綁定一個監聽器。用

python-類-入門到精通

0.本文內容--繼承 在上一篇部落格中,講述了python3類的基本使用方法,本篇部落格著重介紹類的繼承特性。 在編寫類的時候,我們不一定都要從空白開始。如果我們正在編寫的類,實際上是另外一個已經存在的類的特殊版本,那麼我們就可以使用類的繼承。B類繼承A類後,B類將自動獲取A類的所有屬性和方

Matlab入門到精通

1、數值的記述 3 -98 0.002 9.88 1.4e-3 4.99e23 2、變數命名規則       &

Tensorflowsharp入門到放棄——這次有個手寫數字識別

接上文,原始碼是控制檯的:所有輸出Console.WriteLine(*);這樣的程式碼一致改為this.textBox1.Text +="\r\n"+ string.Format(*); 這次又更新了四課內容,其中手寫數字識別卡住了一會,主要原因是網上 TF#的MNIST

Node.js入門到實戰Node.js基本用法

參考: 一、Node.js中的模組 Node.js使用require引入依賴的模組,因此模組是Node.js中的重要組成部分,這篇部落格主要羅列一下常用的Node.js模組,並且在後期會新增在工作中用到的模組參考備用。 二、Node.js EventEmitter Node

springboot入門到精通

這一節我們一起用springboot開發一個應用程式,應用程式裡的核心概念是玩家獲取英雄列表上的英雄資訊。 1、定義實體模型: 程式碼如下: package com.dota.herolist.entity; import javax.persistence.Entity;import javax.p