python網路爬蟲系列教程——python中BeautifulSoup4庫應用全解
全棧工程師開發手冊 (作者:欒鵬)
python中BeautifulSoup4庫的基礎應用,網頁資料探勘的常用庫之一。也就是說最主要的功能是從網頁抓取資料。
使用前需要先安裝BeautifulSoup庫點選下載
python3.6中程式碼
#coding:utf-8
# BeautifulSoup抓取
import urllib #python3中urllib整合了五大模組urllib.error、urllib.parse、urllib.request、urllib.response、urllib.robotparser
import re
from bs4 import BeautifulSoup
print("============獲取網頁原始碼============")
host = 'http://www.525heart.com/index/index/index.html'
text = urllib.request.urlopen(host).read() #獲取網頁原始碼,是位元組陣列
#response=urllib.request.urlopen(host)
#text = str(response.read(),encoding='utf-8') #read獲取的是位元組陣列,可以翻譯成字串
print("============解析網頁原始碼============" )
soup = BeautifulSoup(text, 'html.parser') #前一個引數為要解析的文字,後一個引數為解析模型
# bs4的HTML解析器:BeautifulSoup(mk,'html.parser')——條件:安裝bs4庫
# lxml的HTML解析器:BeautifulSoup(mk,'lxml')——pip install lxml
# lxml的XML解析器:BeautifulSoup(mk,'xml')——pip install lxml
# html5lib的解析器:BeautifulSoup(mk,'html5lib')——pip install html5lib
# print(soup.prettify()) #列印解析的內容
print("============物件劃分============")
#解析以後全部html程式碼轉變為4種類型:
#基本物件型別
# 1、Tag——標籤,最基本的資訊組織單元,分別用<>和</>表明開頭和結尾
# 1.1、標籤Name屬性——標籤的名字,<p>...</p>的名字是'p',格式:<tag>.name
# 1.2、標籤Attributes屬性——標籤的屬性,字典形式組織,格式:<tag>.attrs
# 2、NavigableString——標籤內非屬性字串,<>...</>中的字串,格式:<tag>.string
# 3、Comment——標籤內字串的註釋部分,一種特殊的Comment型別(尖括號歎號表示註釋開始:<!--This is a commet-->)
# 4、BeautifulSoup物件(整個html物件soup)
print(soup.a) #第一個a標籤
print(soup.a.string) #第一個a標籤的文字顯示
print(type(soup.a.string)) #第一個a標籤的物件型別,型別可以能是bs4.element.xxx
print(soup.title) #第一個title標籤
print(soup.head) #第一個head標籤
print("============獲取標籤內容屬性============")
#標籤獲取
for tag in soup('a'): #根據標籤名獲取標籤
# print tag.name #標籤的名字
# print tag.parent.name #標籤的父標籤的名字
# print tag.parent.parent.name #標籤的父標籤的父標籤名字
# print tag.string #獲得標籤內非屬性字串(NavigableString )innerText
link = tag.attrs['href'] #標籤的屬性
link = tag['href'] #標籤的屬性
link = tag.get('href') #標籤的屬性
print(urllib.parse.urljoin(host,link)), #在指定網址中的連線的絕對連線
print(tag.name), #標籤的名稱
print(tag.attrs), #屬性
print(tag.string) #標籤內的文字顯示
print(tag.get_text()) #獲取標籤內文字內容
print("============搜尋============")
# find_all( name , attrs , recursive , text , **kwargs ) #返回結果只包含一個元素的列表
# find( name , attrs , recursive , text , **kwargs ) #直接返回結果
print("============搜尋-按標籤搜尋============")
print(soup.find_all('a')[0]) #按字串查詢
print(soup.find_all(re.compile("^a"))[0]) #按正則表示式查詢
print(soup.find_all(["a", "b"])[0]) #按列表查詢
print(soup.find_all(True)[1]) #查詢所有元素,第一個元素就是html元素,就是整個全文
def has_class_but_no_id(tag):
return tag.has_attr('href') and not tag.has_attr('target') #返回 True才查詢
print(soup.find_all(has_class_but_no_id)) #按方法查詢
print("============搜尋-按屬性搜尋============")
print(soup.find_all(id='headerImg')) #按屬性值查詢,data-*不能查詢
print(soup.find_all(href=re.compile("#"))) #按屬性值的正則表示式查詢
print(soup.find_all(href=re.compile(".*index\.html"), target='_blank')) #按屬性值列表查詢
print(soup.find_all("a", class_="current")) #標籤屬性聯合搜尋,class 是 python 的關鍵詞,所以加了_
print(soup.find_all(attrs={"class": "current"})) #搜尋包含指定屬性值的元素
print("============搜尋-按文字搜尋============")
print(soup.find_all(text="首頁")) #按文字搜素,接受的引數與按標籤搜尋一樣
print(soup.find_all("a", limit=2,recursive=False)) #以上所有搜尋都可以用limit限定最大搜索到的數目,用recursive限定只搜尋直接子節點
print("============搜尋-按css選擇器名稱搜尋============")
print(soup.select('title')) #按名稱
print(soup.select('.current')) #按類名
print(soup.select('#headerImg')) #按id
print(soup.select('li .current')) #後代查詢
print(soup.select("head > title")) #子標籤查詢
print(soup.select('a[class="current"]')) #屬性查詢
print("============節點遍歷-向下遍歷============")
#find_parents() find_parent() #搜尋當前節點的父輩節點
#find_next_siblings() find_next_sibling() #搜尋符合條件的後面的兄弟節點
#find_previous_siblings() find_previous_sibling() #搜尋符合條件的前面的兄弟節點
#find_all_next() find_next() #對當前 tag 的之後的 tag 和字串進行迭代
#find_all_previous() 和 find_previous() #對當前節點前面的 tag 和字串進行迭代
#遍歷(向下)
# contents屬性:直接子節點的列表,將<tag>所有兒子節點存入列表
print(soup.head.contents[0])
# children屬性:子節點的迭代型別,與.contents類似,用於迴圈遍歷兒子節點
# descendants屬性:後代節點的迭代型別,包含所有子孫節點,用於迴圈遍歷
for child in soup.body.children: #直接子節點列表,迭代型別,需要用迴圈方式,空格、換行也是子節點
print("body's child:"+str(child.name))
#for string in soup.strings: #遍歷獲取所有顯示文字內容,soup.stripped_strings可以去除空格或換行
# print(repr(string))
#遍歷(向上)
# parent屬性:節點的父標籤
# parents屬性:節點先輩標籤的迭代型別,用於迴圈遍歷先輩節點
print("============節點遍歷-同胞遍歷============")
#遍歷(平級)
firstli=soup('li')[0] #等價於soup.li
print(firstli.next_sibling) #注意空格換行也是節點
print(firstli.previous_sibling) #注意空格換行也是節點
for sibling in firstli.next_siblings: #注意空格換行也是節點
print('next_siblings:',sibling)
for sibling in firstli.previous_siblings: #注意空格換行也是節點
print('previous_siblings:'+str(sibling))
#遍歷(程式碼前後)
#next_elements當前節點之後的所有節點
#previous_elements當前節點之前的所有節點
#next_element當前節點的下一個節點
#previous_element當前節點的前一個節點
python2.7中程式碼
#coding:utf-8
# BeautifulSoup抓取
from urllib import urlopen
import re
from urlparse import urljoin
from bs4 import BeautifulSoup
print("============獲取網頁原始碼============")
host = 'http://www.525heart.com/index/index/index.html'
text = urlopen(host).read() #獲取網頁原始碼
print("============解析網頁原始碼============")
soup = BeautifulSoup(text, 'html.parser') #前一個引數為要解析的文字,後一個引數為解析模型
# bs4的HTML解析器:BeautifulSoup(mk,'html.parser')——條件:安裝bs4庫
# lxml的HTML解析器:BeautifulSoup(mk,'lxml')——pip install lxml
# lxml的XML解析器:BeautifulSoup(mk,'xml')——pip install lxml
# html5lib的解析器:BeautifulSoup(mk,'html5lib')——pip install html5lib
# print(soup.prettify()) #列印解析的內容
print("============物件劃分============")
#解析以後全部html程式碼轉變為4種類型:
#基本物件型別
# 1、Tag——標籤,最基本的資訊組織單元,分別用<>和</>表明開頭和結尾
# 1.1、標籤Name屬性——標籤的名字,<p>...</p>的名字是'p',格式:<tag>.name
# 1.2、標籤Attributes屬性——標籤的屬性,字典形式組織,格式:<tag>.attrs
# 2、NavigableString——標籤內非屬性字串,<>...</>中的字串,格式:<tag>.string
# 3、Comment——標籤內字串的註釋部分,一種特殊的Comment型別(尖括號歎號表示註釋開始:<!--This is a commet-->)
# 4、BeautifulSoup物件(整個html物件soup)
print(soup.a) #第一個a標籤
print(soup.a.string) #第一個a標籤的文字顯示
print type(soup.a.string) #第一個a標籤的物件型別,型別可以能是bs4.element.xxx
print(soup.title) #第一個title標籤
print(soup.head) #第一個head標籤
print("============獲取標籤內容屬性============")
#標籤獲取
for tag in soup('a'): #根據標籤名獲取標籤
# print tag.name #標籤的名字
# print tag.parent.name #標籤的父標籤的名字
# print tag.parent.parent.name #標籤的父標籤的父標籤名字
# print tag.string #獲得標籤內非屬性字串(NavigableString )innerText
link = tag.attrs['href'] #標籤的屬性
link = tag['href'] #標籤的屬性
link = tag.get('href') #標籤的屬性
print(urljoin(host,link)), #在指定網址中的連線的絕對連線
print(tag.name), #標籤的名稱
print(tag.attrs), #屬性
print(tag.string) #標籤內的文字顯示
print(tag.get_text()) #獲取標籤內文字內容
print("============搜尋============")
# find_all( name , attrs , recursive , text , **kwargs ) #返回結果只包含一個元素的列表
# find( name , attrs , recursive , text , **kwargs ) #直接返回結果
print("============搜尋-按標籤搜尋============")
print(soup.find_all('a')[0]) #按字串查詢
print(soup.find_all(re.compile("^a"))[0]) #按正則表示式查詢
print(soup.find_all(["a", "b"])[0]) #按列表查詢
print(soup.find_all(True)[1]) #查詢所有元素,第一個元素就是html元素,就是整個全文
def has_class_but_no_id(tag):
return tag.has_attr('href') and not tag.has_attr('target') #返回 True才查詢
print(soup.find_all(has_class_but_no_id)) #按方法查詢
print("============搜尋-按屬性搜尋============")
print soup.find_all(id='headerImg') #按屬性值查詢,data-*不能查詢
print soup.find_all(href=re.compile("#")) #按屬性值的正則表示式查詢
print soup.find_all(href=re.compile(".*index\.html"), target='_blank') #按屬性值列表查詢
print soup.find_all("a", class_="current") #標籤屬性聯合搜尋,class 是 python 的關鍵詞,所以加了_
print soup.find_all(attrs={"class": "current"}) #搜尋包含指定屬性值的元素
print("============搜尋-按文字搜尋============")
print(soup.find_all(text="首頁")) #按文字搜素,接受的引數與按標籤搜尋一樣
print(soup.find_all("a", limit=2,recursive=False)) #以上所有搜尋都可以用limit限定最大搜索到的數目,用recursive限定只搜尋直接子節點
print("============搜尋-按css選擇器名稱搜尋============")
print(soup.select('title')) #按名稱
print(soup.select('.current')) #按類名
print(soup.select('#headerImg')) #按id
print(soup.select('li .current')) #後代查詢
print(soup.select("head > title")) #子標籤查詢
print(soup.select('a[class="current"]')) #屬性查詢
print("============節點遍歷-向下遍歷============")
#find_parents() find_parent() #搜尋當前節點的父輩節點
#find_next_siblings() find_next_sibling() #搜尋符合條件的後面的兄弟節點
#find_previous_siblings() find_previous_sibling() #搜尋符合條件的前面的兄弟節點
#find_all_next() find_next() #對當前 tag 的之後的 tag 和字串進行迭代
#find_all_previous() 和 find_previous() #對當前節點前面的 tag 和字串進行迭代
#遍歷(向下)
# contents屬性:直接子節點的列表,將<tag>所有兒子節點存入列表
print(soup.head.contents[0])
# children屬性:子節點的迭代型別,與.contents類似,用於迴圈遍歷兒子節點
# descendants屬性:後代節點的迭代型別,包含所有子孫節點,用於迴圈遍歷
for child in soup.body.children: #直接子節點列表,迭代型別,需要用迴圈方式,空格、換行也是子節點
print("body's child:"+str(child.name))
#for string in soup.strings: #遍歷獲取所有顯示文字內容,soup.stripped_strings可以去除空格或換行
# print(repr(string))
#遍歷(向上)
# parent屬性:節點的父標籤
# parents屬性:節點先輩標籤的迭代型別,用於迴圈遍歷先輩節點
print("============節點遍歷-同胞遍歷============")
#遍歷(平級)
firstli=soup('li')[0]; #等價於soup.li
print(firstli.next_sibling) #注意空格換行也是節點
print(firstli.previous_sibling) #注意空格換行也是節點
for sibling in firstli.next_siblings: #注意空格換行也是節點
print('next_siblings:',sibling)
for sibling in firstli.previous_siblings: #注意空格換行也是節點
print('previous_siblings:'+str(sibling))
#遍歷(程式碼前後)
#next_elements當前節點之後的所有節點
#previous_elements當前節點之前的所有節點
#next_element當前節點的下一個節點
#previous_element當前節點的前一個節點
相關推薦
python網路爬蟲系列教程——python中BeautifulSoup4庫應用全解
全棧工程師開發手冊 (作者:欒鵬) python中BeautifulSoup4庫的基礎應用,網頁資料探勘的常用庫之一。也就是說最主要的功能是從網頁抓取資料。 使用前需要先安裝BeautifulSoup庫點選下載 python3.
python網路爬蟲系列教程——Python+PhantomJS +Selenium組合應用
全棧工程師開發手冊 (作者:欒鵬) Selenium 是什麼?一句話,自動化測試工具。它支援各種瀏覽器,包括 Chrome,Safari,Firefox 等主流介面式瀏覽器。 理解Selenium很簡單,平時我們使用的獲取網頁,都是
18、python網路爬蟲之Scrapy框架中的CrawlSpider詳解
正則 art _id 糗事百科 put pytho 切換 ron 提交 CrawlSpider的引入: 提問:如果想要通過爬蟲程序去爬取”糗百“全站數據新聞數據的話,有幾種實現方法? 方法一:基於Scrapy框架中的Spider的遞歸爬取進行實現(Reque
【Python網路爬蟲開發教程】Beautiful Soup 4.2.0 文件
解析器之間的區別 Beautiful Soup為不同的解析器提供了相同的介面,但解析器本身時有區別的.同一篇文件被不同的解析器解析後可能會生成不同結構的樹型文件.區別最大的是HTML解析器和XML解析器,看下面片段被解析成HTML結構: BeautifulSoup("<a>&l
python網路爬蟲學習日記-----urllib中urlopen()的使用
urllib的四個模組 request:基本的Http請求模組 error:異常模組 parse:工具模組,url處理方法 robotparser:識別網上的robots.tst檔案,判斷網站是否可爬 傳送請求 urlopen() 先使用urlopen()
小飛俠帶你精通Python網路程式設計系列03-Python版本的選擇
1. 目前Python有兩個主要版本Python2.X和Python3.X 2. Python2.X最後一個版本是2.7,目前(2018年10月21日)Python3.X最新版本為3.7 3. 很不幸,Python3不完全相容Python2,事實上Python3 在2008年就釋出了,而最後一個Pytho
python資料儲存系列教程——python操作sqlite資料庫:連線、增刪查改、指令執行
全棧工程師開發手冊 (作者:欒鵬) python操作sqlite資料庫 sqlite資料庫以.db格式的檔案形式存在,所以不需要安裝驅動和應用系統,在標準庫中也集成了sqli
Python網路爬蟲與資訊提取-Day5-Requests庫網路爬取實戰
一、京東商品頁面的爬取 先選取一個商品頁面 直接利用之前的程式碼框架即可 import requests url = "https://item.jd.com/12186192.html" try: r = requests.get(url) r.raise_for
python資料儲存系列教程——python(pandas)讀寫csv檔案
全棧工程師開發手冊 (作者:欒鵬) CSV檔案的規範 1、使用回車換行(兩個字元)作為行分隔符,最後一行資料可以沒有這兩個字元。 2、標題行是否需要,要雙方顯示約定 3、每行記錄的欄位數要相同,使用逗號分隔。逗號是預設使用的值
Scrapy網路爬蟲系列教程(一) | Scrapy爬蟲框架的開發環境搭建
本文主要介紹一下Scrapy爬蟲框架的開發環境搭建。主要有: Python的安裝,IDE的選擇,MySQL及Navicat的安裝,開發環境Virtualenv、Virtualenvwrapper的搭建以及Scrapy的安裝。 Pytho
Scrapy網路爬蟲系列教程(二)| 提取網頁上的內容
今天我們新建第一個爬蟲程式,爬取[伯樂線上]網站上一個網頁的內容。 建立專案 [按照上一篇文章所講的,你已經建好一個虛擬環境並安裝好了 scrapy] 首先,開啟控制檯,進入虛擬環境,輸入 scrapy startproject jobbole
python網路爬蟲(7)爬取靜態資料詳解
目的 爬取http://seputu.com/資料並存儲csv檔案 匯入庫 lxml用於解析解析網頁HTML等原始碼,提取資料。一些參考:https://www.cnblogs.com/zhangxinqi/p/9210211.html requests請求網頁 chardet用於判斷網頁中的字元編
Python 網路爬蟲實戰:爬取 B站《全職高手》20萬條評論資料
本週我們的目標是:B站(嗶哩嗶哩彈幕網 https://www.bilibili.com )視訊評論資料。 我們都知道,B站有很多號稱“鎮站之寶”的視訊,擁有著數量極其恐怖的評論和彈幕。所以這次我們的目標就是,爬取B站視訊的評論資料,分析其為何會深受大家喜愛。 首先去調研一下,B站評論數量最多的視訊是哪一
js系列教程4-函式、函式引數全解
全棧工程師開發手冊 (作者:欒鵬) 在js中,函式本身屬於物件的一種,因此可以定義、賦值,作為物件的屬性或者成為其他函式的引數。函式名只是函式這個物件類的引用。 函式定義 一、3種函式定義方式 【1】函式宣告語句 使用function關鍵字
史上最全面的SignalR系列教程-4、SignalR 自託管全解(使用Self-Host)-附各終端詳細例項
1、概述 通過前面幾篇文章 史上最全面的SignalR系列教程-1、認識SignalR 史上最全面的SignalR系列教程-2、SignalR 實現推送功能-永久連線類實現方式 史上最全面的SignalR系列教程-3、SignalR 實現推送功能-集線器類實現方式 我們對SignalR的概念以及SignalR
Python網路爬蟲中的網頁中文正則表示式匹配小心得
這是第一篇部落格,關於在正則表示式的情況下通過python的re模組對爬蟲爬下的網頁資料進行正則表示式,匹配得出所有中文字元 #!/usr/bin/python # -*- coding: utf-8 -*- import re def matchURL_info(
python初級實戰系列教程《一、爬蟲之爬取網頁、圖片、音視訊》
python基礎知識可以到廖雪峰大佬的官網學習哦! 廖雪峰官網網址 學完python就開始我們的實戰吧!首先我們就來學習下python爬蟲 學習Python爬蟲,先是介紹一個最容易上手的庫urll
用Python寫網路爬蟲系列(三)表單處理
import urllib,urllib2 LOGIN_URL = r'http://example.webscraping.com/user/login' LOGIN_EMAIL = '[email protected]' LOGIN_PASSWORD ='q
python應用系列教程——python使用scapy監聽網路資料包、按TCP/IP協議進行解析
全棧工程師開發手冊 (作者:欒鵬) python使用scapy監聽抓取網路資料包。 scapy具有模擬傳送資料包、監聽解析資料包、網際網路協議解析、資料探勘等多種用處。這裡我們只來說一下scapy監聽資料包,並按照不同的協議進行解析。
Python 網路爬蟲 009 (程式設計) 通過正則表示式來獲取一個網頁中的所有的URL連結,並下載這些URL連結的原始碼
通過 正則表示式 來獲取一個網頁中的所有的 URL連結,並下載這些 URL連結 的原始碼 使用的系統:Windows 10 64位 Python 語言版本:Python 2.7.10 V 使用的程式設計 Python 的整合開發環境:PyCharm 201