如何不斷擴充數據中心的數據規模,提高數據挖掘的價值,這是咱們思考的問題,數據一方面來自於內部生產,一部分數據能夠來自於互聯網,互聯網上的數據體量龐大,形態多樣,以前blog裏不少FMEer已經提出了方案,好比json,xml,正則表達式等等,但對於比較鬆散的HTML如何進行數據解析提取呢?我問了一下度娘,貌似沒有FME下的文章,恰逢今天有時間,就寫一點關於HTML提取的東東,算是本身作的筆記吧!
此次我要提取的範例數據來自國土資源局土地招拍掛系統,我要提取上面的交易結果以及地塊信息,樣式以下圖:
圖1:交易結果列表
圖2:地塊信息
圖3:轉換工程
圖4:提取後的數據
在這個轉換工程裏,用到了幾個轉換器,它們是:pythonCreator,HTTPCaller,HTMLExtractor、PythonCaller、StringSearcher、StringReplacer、AttributeExposer、AttributeRenamer、AttributeRemover
本文重點介紹一下HTMLExtractor,轉換器的參數以下圖:
圖5:HTMLExtractor參數
圖上標註的參數依次是:
一、 HTML Input:HTML的內容來源,能夠是content,表示來源於傳入的屬性、參數等,也能夠是File,表示來源於一個已存在的HTML文件。
二、 HTML Content:本案例用的是content做爲源,與HttpCaller連用,HTML存放於_response_body屬性中。若是是File做爲源,則須要設置HTML File爲文件路徑。
三、 Target Attribute:設置一個屬性(列表)名稱,這個屬性名稱將包含HTML解析的結果。
四、 CSS Selector:設置CSS選擇器,相似正則表達式,但用起來更簡單,特別適合解析HTML。
五、 Tag Part/HTML Attribute:能夠設置爲Value(匹配標籤裏的值)、Whole(匹配的標籤和值)、或者輸入匹配標籤擁有的一個屬性名稱,好比<a>標記的href屬性。
六、 Return Format:能夠設置爲List Attribute,則將全部匹配的內容做爲一個list返回,若是爲First Match,則僅返回第一個匹配的內容。
舉個栗子,下面是我要匹配的交易結果HTML源文件:
<tr class="TR2" onMouseOver="this.className='TR3';" onMouseOut="this.className='TR2';">
<td height="31" align="left" class="TD1"><img src="images/arrow_yellow.gif">2</td>
<td class="TD1" align="left">BQ2-19-87</td>
<td class="TD1" align="left">國有建設用地使用權</td>
<td class="TD1" align="left">15851.0萬元</td>
<td class="TD1" align="left">15851.0萬元</td>
<td class="TD1" align="left">西安奧達房地產開發有限責任公司</td>
<td class="TD1" align="left">2017-04-27 16:00</td>
<td class="TD1" align="center" style="color:#FF0000;cursor:pointer;" onClick="window.open('publics/ResourceFrame.jsp?id=933&lx=L','','left=10,top=10,width=890,height=650,scrollbars=yes,resizable=yes,status=yes')">已成交</td>
</tr>
我要把紅色的內容提取出來,我只須要簡單的寫一句CSS選擇器進行匹配便可,但在寫以前通常是要先整理分析一下HTML源文件,找出能夠用於匹配的特徵,提升匹配的準確度,減小其餘雜質數據被提取出來。
由於HTML源文件中有大量的<td>,因此直接匹配td是不行的,通過分析我找到了特徵,CSS選擇器爲:tr[onMouseOver] td。意思是擁有onMouseOver屬性的tr標記下的td標記。
就這麼簡單,獲取的數據還有少許雜質,再用其餘的轉換器清洗一下便可。
另外,最近正則表達式呼聲很高,必須認可,正則表達式很是強大,但有些工做仍是有更簡單的辦法,殺雞焉用牛刀,對於HTML,經過編寫CSS選擇器應用HTMLExtractor轉換器來解析數據,更加敏捷高效!python