1. 程式人生 > >python解析網頁中javascript動態新增的內容 一

python解析網頁中javascript動態新增的內容 一

最近,想從中國天氣網上抓取資料,其中的網頁上的實時天氣是使用javascript生成的,用簡單的標籤解析不到。原因是,那個標籤壓根就沒再網頁當中。

所以,google了下python怎麼區解析動態網頁,下面文章對我很有幫助。

因為我只希望在mac下解析,所以我並沒有使用擴平臺的庫。在使用spidermonkey後,發現它還是很全面,比如document.write就無法執行(如果我的認識有錯誤,請指出,謝謝)。我將目光落在了pywebkitgtk上,可惜安裝不成功,逼迫我放棄了(我有考慮過使用pyv8,但是還是放棄了)。

在經歷了失敗後,我還是從homebrew這個神器上發現了希望。它可以幫你安裝pyqt,可能知道它是一個python的

介面庫,但是它同樣擁有網路模組(webkit),當然也可以使用它來解析網頁。

我將分析一下我解析動態網頁的過程,此過程實現多於原理學習:

第一步:解析靜態網頁標籤

 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("