html源碼解析
① python爬蟲:HTML網頁解析方法小結
要理解python是如何解析網頁的,首先要理解什麼是網頁解析器。
簡單的說就是用來解析html網頁的工具,准確的說:它是一個HTML網頁信息提取工具,就是從html網頁中解析提取出「我們需要的有價值的數據」或者「新的URL鏈接」的工具。
解析HTML:
我們知道爬蟲的原理無非是把目標網址的內容下載下來存儲到內存中,這個時候它的內容其實是一堆HTML,然後再對這些HTML內容進行解析,按照自己的想法提取出想要的數據。
今天主要講講Python中解析網頁HTML內容的四種方法:
其中BeautifulSoup和XPath是python中解析網頁常用的兩個庫,對於新手來說是利器,零基礎小白建議先打好Python基礎再去上手爬蟲會容易一些。
「零基礎如何學Python」在知乎看到過一篇比較好的問答貼,講的很實用,大傢伙可以移步去看看,鏈接分享在下方。
1、BeautifulSoup
大名鼎鼎的BeautifulSoup庫,在Pyhton的HTML解析庫里屬於重量級的庫。
安裝途徑:
解析的第一步,是構建一個BeautifulSoup對象。
第二個參數表示解析器,BeautifulSoup支持以下多種解釋器:
BeautifulSoup對應一個HTML/XML文檔的全部內容;
BeautifulSoup類的基本元素
任何存在於HTML語法中的標簽都可以用soup.訪問獲得,當HTML文檔中存在多個相同對應內容時,soup.返回第一個。
每個都有自己的名字,通過.name獲取,字元串類型 Tag的attrs:一個可以有0或多個屬性,字典類型 NavigableString可以跨越多個層次
1)訪問標簽
通過點號操作符,可以直接訪問文檔中的特定標簽,示例:
這樣的方式每次只會返迴文檔中的第一個標簽,對於多個標簽,則通過find_all方法返回多個標簽構成的列表。
還可以在find方法中添加過濾條件,更加精確的定位元素。
2)訪問標簽內容和屬性
通過name和string可以訪問標簽的名字和內容,通過get和中括弧操作符則可以訪問標簽中的屬性和值。
結合定位元素和訪問屬性的方法,可以方便快捷的提取對應元素,提高解析html的便利性。
使用Beautiful Soup庫解析網頁
BeautifulSoup解析內容同樣需要將請求和解析分開,從代碼清晰程度來講還將就,不過在做復雜的解析時代碼略顯繁瑣,總體來講用起來還不錯,看個人喜好吧。
爬蟲的基本技能最重要的兩點:如何抓取數據?如何解析數據?我們要活學活用,在不同的時候利用最有效的工具去完成我們的目的。
工具是其次,學習不要主末顛倒了,我上面分享的那篇文章也有提到過這個問題(鏈接有放在下方),要明確你學習的最終目的是什麼?
2、lxml的XPath
lxml這個庫同時支持HTML和XML的解析,支持XPath解析方式,解析效率挺高,不過我們需要熟悉它的一些規則語法才能使用。
使用xpath需要從lxml庫中導入etree模塊,還需要使用HTML類對需要匹配的HTML對象進行初始化。
安裝途徑:
Xpath常用表達式
使用表達式定位head和title節點
Xpath謂語常用的表達式
使用謂語定位head和ul節點
定位並獲取title節點內的文本內容
提取ul節點下的所有文本文件和鏈接地址
XPath的解析語法稍顯復雜,不過熟悉了語法的話也不失為一種優秀的解析手段。
示例:
3、requests-html
我們知道 requests 只負責網路請求,不會對響應結果進行解析,因此可以把 requests-html 理解為可以解析 HTML 文檔的 requets 庫。
requests-html 的代碼量非常少,都是基於現有的框架進行二次封裝,開發者使用時可更方便調用,它依賴於 PyQuery、requests、lxml 等庫。
安裝途徑:
需要注意的是這個庫目前只支持python3.6版本;
requests-html 具有以下特性:
requests-html默認使用session保持的請求方式,且其返回內容是一個帶有豐富方法的對象。
獲取一個隨機User-Agent
不用每次在請求頭裡面去復制user-agent;
對JavaScript的支持是requests-html最大的亮點,會用到render函數,需要注意的是第一次使用這個方法,它會先下載Chromium,然後使用Chromium來執行代碼,但是下載的時候可能需要一個梯子,這里就先不展開討論了。
學過requests庫的看到requests-html的api應該會很熟悉,使用方法基本一致,不同的是使用requests編寫爬蟲時,要先把網頁爬取下來,然後再交給BeautifulSoup等一些html解析庫,現在可以直接解析了。
示例:
通過簡短的幾行代碼,就可以把整個首頁的文章抓取下來。
示例中使用的幾個方法:
① find( ) 可以接收兩個參數:
第一個參數可以是class名稱或ID第二個參數first=True時,只選取第一條數據
② text 獲取元素的文本內容
③ attrs 獲取元素的屬性,返回值是個字典
④ html 獲取元素的html內容
使用requests-html來解析內容的好處在於作者都高度封裝過了,連請求返回內容的編碼格式轉換也自動做了,完全可以讓代碼邏輯更簡單直接,更專注於解析工作本身。
4、正則表達式
正則表達式通常被用來檢索、替換那些符合某個模式的文本,所以我們可以利用這個原理來提取我們想要的信息。
使用正則表達式, 需要導入re模塊,該模塊為Python提供了完整的正則表達式功能。
嚴格的字元匹配示例:
注意:python只支持re模塊進行正則表達式的書寫
使用正則表達式查找網頁內容中的title內容:
使用正則表達式無法很好的定位特定節點並獲取其中的鏈接和文本內容,而使用Xpath和Beautiful Soup能較為便利的實現這個功能。
正則就是編寫麻煩,理解不容易,但是匹配效率很高,不過現在有很多現成的HTMl內容解析庫之後,不太推薦再手動用正則來對內容進行匹配了,麻煩費時費力。
5、小結:
(1)正則表達式匹配不推薦,因為已經有很多現成的庫可以直接用,不需要我們去大量定義正則表達式,還沒法復用,嘗試過正則表達式的小白就能體會,使用正則表達式來篩選網頁內容是有多費勁,而且總是感覺效果不太好。
(2)BeautifulSoup是基於DOM的方式,簡單的說就是會在解析時把整個網頁內容載入到DOM樹里,內存開銷和耗時都比較高,處理海量內容時不建議使用。
BeautifulSoup不需要結構清晰的網頁內容,因為它可以直接找到我們想要的標簽,如果對於一些HTML結構不清晰的網頁,它比較適合。
(3)XPath是基於SAX的機制來解析,不會像BeautifulSoup去載入整個內容到DOM里,而是基於事件驅動的方式來解析內容,更加輕巧。
不過XPath要求網頁結構需要清晰,而且開發難度比DOM解析的方式高一點,推薦在需要解析效率時使用。
(4)requests-html 是比較新的一個庫,高度封裝且源碼清晰,它直接整合了大量解析時繁瑣復雜的操作,同時支持DOM解析和XPath解析兩種方式,靈活方便,可以嘗試。
除了以上介紹到幾種網頁內容解析方式之外還有很多解析手段,這里就暫不一一介紹了。
② 什麼是HTML源碼
HTML是用來做網站的一種語言哈、這樣吧、你打開一個網頁、然後再網頁任何一個地方點擊滑鼠右鍵、然後選擇「查看源文件」、點擊過後將以記事本的形式打開、裡面的就全是HTML代碼哈、看看吧、希望對你有所幫助!至於怎麼使用這個就有專門的教程了哈、你到網路文庫裡面找找教程嘛
③ html加密解密代碼
<HTML><HEAD><TITLE>純真過往-方寧 - 加密/解密HTML源代碼</TITLE>
<META content="text/html; charset=gb2312" http-equiv=Content-Type>
<META content="script,windows" name=keywords>
<STYLE>.tablinks A {COLOR: blue}
.tablinks A:visited { COLOR: blue}
.tablinks A:hover {COLOR: brown}
input{ font-family: Tahoma; font-size: 9pt; color: #000080 }
body,textarea{ font-family: Tahoma; font-size: 9pt; color: blue}
</STYLE>
</HEAD>
<BODY bgColor=#D6D3CE leftMargin=0 marginwidth="0" scroll=no oncontextmenu="self.event.returnValue=false">
<div align="center">
<center>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="600">
<TBODY>
<TR>
<TD align=left vAlign=top>
<div align="center" style="width: 598; height: 42">
<div align="center">
<font color="#0066ff">加密頁面源代碼腳本</font>
</div>
<p><font color="#800000">將你的頁面源代碼粘貼在下面的框內,要包括所有的標簽例如html
, head, body等。</font></p>
</div>
<P align=center>
<P align=left><!--webbot bot="HTMLMarkup" startspan -->
<SCRIPT language=JavaScript>
var i=0;
var ie=(document.all)?1:0;
var ns=(document.layers)?1:0;
function generate() /* Generation of "Compilation" */
{
code = document.pad.text.value;
if (code)
{
document.pad.text.value='純真過往-方寧正在加密中...請等待!';
setTimeout("compile()",1000);
}
else alert('純真過往-方寧提醒您:還沒有放入要加密的網頁代碼!')
}
function compile() /* The "Compilation" */
{
document.pad.text.value='';
compilation=escape(code);
document.pad.text.value="<script>\n<!--\ndocument.write(unescape(\""+compilation+"\"));\n//-->\n<\/script>";
i++;
alert("(純真過往)已將所選內容加密成功!請點預覽查看效果!");
}
function selectCode() /* Selecting "Compilation" for Copying */
{
if(document.pad.text.value.length>0)
{
document.pad.text.focus();
document.pad.text.select();
}
else alert('純真過往-方寧提醒您:沒有任何內容可以選定!')
}
function preview() /* Preview for the "Compilation" */
{
if(document.pad.text.value.length>0)
{
pr=window.open("","Preview","scrollbars=1,menubar=1,status=1,width=700,height=320,left=50,top=110");
pr.document.write(document.pad.text.value);
}
else alert('純真過往-方寧提醒您:沒有任何內容可以預覽!')
}
function uncompile() /* Decompiling a "Compilation" */
{
if (document.pad.text.value.length>0)
{
source=unescape(document.pad.text.value);
document.pad.text.value=""+source+"";
}
else alert('純真過往-方寧提醒您:請把你需要解密的代碼放到此處!')
}
// -->
</SCRIPT>
<TABLE border=0 cellPadding=0 cellSpacing=0 width="100%">
<TBODY>
<TR>
<TD width="100%"><!-- Compilation Panel -->
<FORM method=post name=pad align="center"><TEXTAREA cols=58 name=text rows=11 style="BACKGROUND-COLOR: #f0f0f0;width=100%"></TEXTAREA><BR><p align="center"><INPUT name=compileIt onclick=generate() type=button value=加密>
<INPUT name=select onclick=selectCode() type=button value=選定>
<INPUT name=view onclick=preview() type=button value=預覽>
<INPUT name=retur onclick=uncompile() type=button value=解密>
<INPUT name=clear type=reset value=清除>
</FORM><!-- Compilation Panel --></TD></TR></TBODY></TABLE><!--webbot bot="HTMLMarkup" endspan -->
</table>
</center>
</div>
<p align="center"><a href=" http://www.lovehy.com" target="_blank">純真過往-方寧
http://www.czgwnn.cn</a></p>
</BODY>
④ 怎樣才能看懂網頁的源代碼
可用HTML語言理解網頁源代碼。
通常用來編寫網頁的計算機語言有如下三種:
1、HTML語言:最常用最基本的語言,在網頁中不可或缺。網頁的標題、框架、背景、字體、超鏈接、顏色和其他元素的設置是用HTML語言完成的。Html是VB和jav的載體,網頁的後綴名一般為「.HTM」或者「.HTML」。
2、VB語言,又稱visual basic語言,可以進行HTML語言在網頁中無法完成的計算、效果、調用各種數據亂物御庫等。它屬於一種相對高級的語言螞搏,賦予網頁以靈魂,豐富了網頁,使用HTML和VB語言共同編寫的網頁的後綴名一般為「.ASP」。
3、JAVA語言,Java語言的功能與VB語言幾乎相同,但它的功能更強大,其效果可能是壓倒性的。現在大多數動態網頁都是用HTML和Java語言編寫的,後綴名一般為「.ASP」或者「.JSP」。
(4)html源碼解析擴展閱讀:
HTML語言編輯方式:
HTML其實是文本,它需要瀏覽器的解釋嘩岩,它的編輯器大體可以分為以下幾種:
基本的文本和文檔編輯軟體可以使用微軟自己的記事本或寫字板來編寫,當然,如果使用WPS,你也可以,但是,保存磁碟時,請使用,HTM或,HTML作為擴展,使瀏覽器能夠識別和直接解釋執行。
半所見即所得軟體,如:fck編輯器、e-webedit和其他在線網頁編輯器;特別推薦:Sublime文本代碼編輯器(由Jon Skinner開發,Sublime text2收費,但可以無限期試用)。
⑤ HTML代碼中<%%>、<%=%>、<%:%>各是什麼意思分別用來實現什麼的
<%=%>是用來綁定數據的;
<%:%>是python在.html文件中的用法;
<% %>叫做腳本片段,其中寫的內容會翻譯在Servlet的Service方法中,顯然我們可以在Service方法中定義局部變數或者調用其他方法。
{% for img in imgs %}
{% end %}
max{x,y} 是取x,y中的最大值
正則表達式:
對字元串(包括普通字元(例如,a 到 z 之間的字母)和特殊字元(稱為「元字元」))操作的一種邏輯公式,就是用事先定義好的一些特定字元、及這些特定字元的組合,組成一個「規則字元串」,這個「規則字元串」用來表達對字元串的一種過濾邏輯。
⑥ 網頁源代碼的基本結構是什麼
如圖:
(6)html源碼解析擴展閱讀:
標簽詳解:
1.<!doctype>:是聲明用哪個 HTML 版本進行編寫的指令。並不是 HTML 標簽。<!doctype html>:html5網頁聲明,表示網頁採用html5。
2.<meta>:提供有關頁面的元信息(針對搜索引擎和更新頻度的描述和關鍵詞等),寫在<head>標簽內。
a)<meta charset="UTF-8">:設置頁面的編碼格式UTF-8;
b)<meta name="Generator" content="EditPlus">:說明生成工具為EditPlus;
c)<meta name="Author" content="">:告訴搜索引擎站點製作的作者;
d)<meta name="Keywords" content="">:告訴搜索引擎網站的關鍵字;
e)<meta name="Description" content="">:告訴搜索引擎網站的內容;