1. 程式人生 > >python網路爬蟲系列教程——python中BeautifulSoup4庫應用全解

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網路爬蟲系列教程——pythonBeautifulSoup4應用

全棧工程師開發手冊 (作者:欒鵬) 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網路爬蟲學習日記-----urlliburlopen()的使用

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