python解析網頁中javascript動態新增的內容 一
最近,想從中國天氣網上抓取資料,其中的網頁上的實時天氣是使用javascript生成的,用簡單的標籤解析不到。原因是,那個標籤壓根就沒再網頁當中。
所以,google了下python怎麼區解析動態網頁,下面文章對我很有幫助。
因為我只希望在mac下解析,所以我並沒有使用擴平臺的庫。在使用spidermonkey後,發現它還是很全面,比如document.write就無法執行(如果我的認識有錯誤,請指出,謝謝)。我將目光落在了pywebkitgtk上,可惜安裝不成功,逼迫我放棄了(我有考慮過使用pyv8,但是還是放棄了)。
在經歷了失敗後,我還是從homebrew這個神器上發現了希望。它可以幫你安裝pyqt,可能知道它是一個python的
我將分析一下我解析動態網頁的過程,此過程實現多於原理學習:
第一步:解析靜態網頁標籤
1 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 2 <html> 3 <head> 4 <title>javascript測試網頁</title> 5 </head> 6 <body> 7 <script type="text/javascript"src="./5757.js"> 8 </script> 9 </body> 10 </html>
上面是測試用的html程式碼,我將解析它的title標籤,很簡單,呵呵~
1 #! /usr/bin/env python 2 3 from htmlentitydefs import entitydefs 4 from HTMLParser import HTMLParser 5 import sys,urllib2 6 7 class DataParser(HTMLParser): 8 def __init__(self):9 self.title = None 10 self.isTag = 0 11 HTMLParser.__init__(self) 12 13 def handle_starttag(self,tag,attrs): 14 if tag == 'title': 15 self.isTag = 1 16 17 18 def handle_data(self,data): 19 if self.isTag: 20 self.title = data 21 22 def handle_endtag(self,tag): 23 if tag == 'title': 24 self.isTag = 0 25 def getTitle(self): 26 return self.title 27 28 url = 'file:///Users/myName/Desktop/pyqt/2.html' 29 #''中內容用瀏覽器開啟,直接複製位址列的內容即可 30 req = urllib2.Request(url) 31 fd = urllib2.urlopen(req) 32 parser = DataParser() 33 parser.feed(fd.read()) 34 print "Title is:",parser.getTitle()
結果是:
第二步 安裝庫
1.我假設你已經安裝了python。
2.在開始解析動態網頁之前,先要安裝pyqt,讓brew去替你安裝,能幫你節省很多精力。。。
瞭解更多homebrew,請訪問官網:homebrew官網
3.說明:本來pyqt是一個GUI庫,但它包含了網路模組webkit,這個將用於解析動態網頁。
第三步 解析javascript動態標籤
1.有很多標籤是動態新增到html網頁中的,所以有時候用python去執行javascript可能不能達到條件,比如動態新增的標籤,所以獲得執行後dom樹是一種比較通用的方法。(可能理解不正確,如果不對,請指正)。
2.來寫一個給上面html檔案外部呼叫的js檔案。
1 alert("這是被呼叫的語句。") 2 var o = document.body; 3 function createDIV(text) 4 { 5 var div = document.createElement("div"); 6 div.innerHTML = text; 7 o.appendChild(div); 8 } 9 createDIV("15");
3.此時,雙擊2.html,看到的效果是:
只有一個15,這就是我們要解析的資料,現在再來看下原始碼:
是不是沒有div標籤,所以現在解析,不可能獲取到的,應為div是5757.js新增上去的(js名字亂取的)~
我們要利用webkit獲取執行後的dom樹:
1 #! /usr/bin/env python 2 3 import sys,urllib2 4 from HTMLParser import HTMLParser 5 from PyQt4.QtCore import * 6 from PyQt4.QtGui import * 7 from PyQt4.QtWebKit import * 8 9 class Render(QWebPage): 10 def __init__(self, url): 11 self.app = QApplication(sys.argv) 12 QWebPage.__init__(self) 13 self.loadFinished.connect(self._loadFinished) 14 self.mainFrame().load(QUrl(url)) 15 self.app.exec_() 16 17 def _loadFinished(self, result): 18 self.frame = self.mainFrame() 19 self.app.quit() 20 21 url = './2.html' 22 r = Render(url) 23 html = r.frame.toHtml() 24 print html.toUtf8() 25 26 # 將執行後的程式碼寫入檔案中 27 f = open('./test.txt','w') 28 f.write(html.toUtf8()) 29 f.close()
我顯示print出來結果,後又將結果寫入test.tex檔案。現在來看看test.tex中有什麼(不要雙擊,否則只有一個15,用你的文字編輯器去檢視,比如:sublime text2):
1 <html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 2 3 4 <title>javascript測試網頁</title> 5 </head> 6 <body> 7 <script type="text/javascript" src="./5757.js"> 8 </script><div>15</div> 9 10 </body></html>
看起來像html程式碼,但是得到了我想要的東西,注意第八行,出現了div標籤~。
最後一步,獲取那個15。
停一下,想一下我們怎麼去獲取:
1 html = r.frame.toHtml()
得到一個QString物件,它不屬於python標準庫。我想在我熟悉pyqt的始末之前,將它轉換成python物件讓我感到更加自在一點。我們可以像解析靜態網頁般區解析它,關鍵在於這一句:
1 parser.feed(fd.read())
當然既然能將它寫入到本地檔案,開啟檔案->解析檔案->獲取資料也是可以的,但我想沒人想那麼麻煩。
查閱一下python的文件:
1 HTMLParser.feed(data) 2 3 Feed some text to the parser. It is processed insofar as it consists of complete elements; incomplete data is buffered until more data is fed or close() is called.data can be either unicode or str, but passing unicode is advised.
發現只要將unicode或str傳入,我們就能順利解析,也許稍微改動下程式碼即可:
1 ! /usr/bin/env python 2 3 4 import sys,urllib2 5 from HTMLParser import HTMLParser 6 from PyQt4.QtCore import * 7 from PyQt4.QtGui import * 8 from PyQt4.QtWebKit import * 9 10 class DataParser(HTMLParser): 11 def __init__(self): 12 self.div = None 13 self.isTag = 0 14 HTMLParser.__init__(self) 15 16 def handle_starttag(self,tag,attrs): 17 if tag == 'div': 18 self.isTag = 1 19 20 21 def handle_data(self,data): 22 if self.isTag: 23 self.title = data 24 25 def handle_endtag(self,tag): 26 if tag == 'div': 27 self.isTag = 0 28 def getDiv(self): 29 return self.title 30 31 32 class Render(QWebPage): 33 def __init__(self, url): 34 self.app = QApplication(sys.argv) 35 QWebPage.__init__(self) 36 self.loadFinished.connect(self._loadFinished) 37 self.mainFrame().load(QUrl(url)) 38 self.app.exec_() 39 40 def _loadFinished(self, result): 41 self.frame = self.mainFrame() 42 self.app.quit() 43 44 url = './2.html' 45 r = Render(url) 46 html = r.frame.toHtml() 47 #print html.toUtf8() 48 49 parser = DataParser() 50 parser.feed(str(html.toUtf8())) 51 print "javascript is",parser.getDiv() 52 53 54 #f = open('./test.txt','w') 55 #f.write(html.toUtf8()) 56 #f.close()
程式碼做了簡單的合併,就將資料解析出來了,執行結果如下:
呵呵,雖然只有3個詞,但的確成功解析了動態標籤,呵呵~
第四步 想說的話
文章的實現多於原理,希望對閱讀文章的人提供一定的幫助。如有不對的地方也請指正。
當然,要將文章的東西直接運用到實際是不現實的,但希望這是一個好的起點。
相關推薦
python解析網頁中javascript動態新增的內容 一
最近,想從中國天氣網上抓取資料,其中的網頁上的實時天氣是使用javascript生成的,用簡單的標籤解析不到。原因是,那個標籤壓根就沒再網頁當中。 所以,google了下python怎麼區解析動態網頁,下面文章對我很有幫助。 因為我只希望在mac下解析,所以我並沒有使用擴
Python 爬取網頁中JavaScript動態新增的內容(二)
使用 selenium + phantomjs 實現 1、準備環境 selenium(一個用於web應用程測試的工具)安裝:pip install selenium phantomjs(是一種無介面的瀏覽器,用於完成網頁的渲染)下載:http://phantomjs.or
Python 爬取網頁中JavaScript動態新增的內容(一)
當我們進行網頁爬蟲時,我們會利用一定的規則從返回的 HTML 資料中提取出有效的資訊。但是如果網頁中含有 JavaScript 程式碼,我們必須經過渲染處理才能獲得原始資料。此時,如果我們仍採用常規方法從中抓取資料,那麼我們將一無所獲。那麼,通過Web kit可以簡單解決這個
python解析網頁中js動態添加的內容
pytho log hive .cn article gree html .com .html https://www.cnblogs.com/asmblog/archive/2013/05/07/3063809.html https://www.zhihu.com/q
Python 爬取網頁中JavaScript動態添加的內容(二)
python tab sta exe div int rom ava script 使用 selenium + phantomjs 實現 1、準備環境 selenium(一個用於web應用程測試的工具)安裝:pip install seleniumphantomjs(是
[python]獲取網頁中內容為漢字的字符串的判斷
vsr rbo ats art htm acad for swe lin IPerf%E2%80%94%E2%80%94%E7%BD%91%E7%BB%9C%E6%B5%8B%E8%AF%95%E5%B7%A5%E5%85%B7%E4%BB%8B%E7%BB%8D%E4%B
淺談js中如何動態新增表頭/表列/表格內容
我想很多童鞋用js動態向表格中新增資料很熟悉,而且也覺得非常簡單!是的,對於寫頁面的童鞋來說,最喜歡寫查詢的頁面了,動態向表格繫結資料。用for迴圈就可以輕鬆搞定。 如果我們的業務需求有所變化,可能我們要的資料就不是這樣一條一條的中規中矩的。如果你還是新手,又
Python爬蟲實戰--(二)解析網頁中的元素
使用requests傳送請求 首先匯入requests庫和beautifulsoup庫 import requests from bs4 import BeautifulSoup 呼叫requests.get()方法獲得指定url的res
使用python解析網頁內容
估計很多人都用過了 Firefox 自帶的Web開發者工具來診斷或除錯網頁,尤其是網站建設人員。該工具非常強大,當我們想研究一張網頁的訪問詳情時,例如想知道網頁包含有哪些請求,各請求的訪問是否正常,訪問時間是怎樣的等等,那麼我們就可以藉助於該工具。Firefox自帶的
第9課、解析網頁中的元素-四周學會爬蟲系統
ini bsp tip 好的 python3 pycharm har tle erp 目標:爬取本地網頁中,評分大於3的文章,並打印出來 準備: 安裝Python3.0。 安裝PyCharm,用於開發Python的集成環境。 安裝BeautifulSoup庫,學習爬蟲
html中元素動態新增與刪除
<div class="unit" > <label>產品引數</label> <input type="button" value="新增" onclick="addProduc
python 讀取excel中單元格的內容
python 讀取excel中單元格的內容 excel檔
js中 ajax動態新增節點無法觸發點選事件
在寫ajax載入資料的時候發現,後面新增進來的demo節點元素,失去了之前的點選事件。 其實最簡單的方法就是直接在標籤中寫onclick="",但是這樣寫有些場景的是實現不了的,最好的方式還是通過給類名繫結一個click事件。 方法一:使用live: live()函式會給被選的元素繫結上一個或者多個事件
用python解析pdf中的文字與表格【pdfplumber的安裝與使用】
我們接觸到的很多文件資料都是以pdf格式存在的,比如:論文,技術文件,標準檔案,書籍等。pdf格式使得用機器從中提取資訊格外困難。 為了解決這個問題,我找到了幾種解決方案,最後選擇了python上的pdfplumber庫,安裝和使用都相對比較方便,效果也還不錯,所以下面介紹這個庫的安裝與使用。 安裝我的電
winform 中panel動態新增控制元件座標原點問題
問題描述 最近在寫winform程式的時候遇到一個小問題,目標效果是類似QQ的聊天對話方塊,每傳送一條訊息會在介面上顯示傳送方的頭像、傳送氣泡、以及訊息內容,如圖 按照原來的想法,每條訊息都是一個獨立的panel,然後在主介面的大的panel中add每一
實現antd下拉框動態新增內容(與資料庫互動)
antd下拉控制元件的動態內容新增(與資料庫互動) antd這個框架給開發帶來了極大的方便,但同時,我認為還有一些不方便的地方:常用的邏輯在文件中沒有體現。需要前端開發經驗的人才能快速上手,而我剛剛接觸這個東西,antd基本將所有常用的控制元件全都封裝了,包括select下拉框,在以往的開發當中,我常常將下
jquery結合js實現動態新增內容,並給動態新增的內容新增事件
jquery結合js實現向後臺傳送請求,給頁面動態新增內容,並給動態新增的內容新增事件.html內容如下: <button class="btn btn-md customButton" id="add_red_envelope">新增紅包&
Android 中記事本動態新增行
先看效果圖: 這是昨天在群裡面有人在問這個問題,在這裡順便記錄一下,這個效果我們可以自定義EditText,實現起來也不難,看乳腺步驟: 第一:初始化Paint,這裡肯定要用到畫筆的
【Python】sys.path.append動態新增搜尋路徑設定
如何將路徑“永久"新增到sys.path? sys.path是Python的搜尋模組的路徑集,是一個list 可以在python 環境下使用sys.path.append(path)新增相關的路徑,但在退出python環境後自己新增的路徑就會自動消失了! 可以使用以下命令輸入當前python 的搜尋
JavaScript動態新增表格並單元格合併處理
//document.getElementById("1").rowSpan = "2";//示例 document.getElementById("2").deleteCell(3); document.getElementById("