標簽歸檔:DOM

Python 之 XML與文本操作

一直想做一個自動讀取RSS,自動更新的站。今晚正好沒有事,先寫個Demo。
臨時先保存到文本文件中。順便復習一下Python。
用到了MD5,XML.DOM,URllib,OS庫,都是默認的。
直接插代碼吧。

import sys
#coding=gb2312
reload(sys)
sys.setdefaultencoding('utf-8')
import md5
import os
import urllib
import xml.dom.minidom as xxs

#Config
tmpPath='E:/Else/rss-engins/'

#FileName2Md5
def md5str(t):
	h=md5.new()
	h.update(t)
	return str(h.hexdigest())
	
#FileSystem
def saveFile(t,c):
	f='data/'+md5str(t)+'.txt'
	if os.path.isfile(f):
		return
	fi=open(tmpPath+'index.txt','a')
	fi.writelines(t+'\n')
	fg=open(tmpPath+f,'w')
	fg.writelines(c)
	
#RSS
def saveRss(f,c,encoding):
	fp=open(f,'w')
	if encoding=='gb2312':
		c=c.decode('gb2312').encode('utf-8')
		c=c.replace('encoding="gb2312"','encoding="utf-8"')
	fp.writelines(c)
	fp.close()
	return f
def getRss(url):
	ul=urllib.urlopen(url)
	t=ul.read()
	ul.close()
	return t
def rssMain(url,encoding):
	f=tmpPath+'xml/'+md5str(url)+'.xml'
	if os.path.isfile(f):
		return "isok"
	return saveRss(f,getRss(url),encoding)

#getInfo
def getRssInfo(url,encoding):
	t=rssMain(url,encoding)
	if t=='isok':
		print '該路徑已經采集過了。'
		return
	t=xxs.parse(t)
	ri=t.getElementsByTagName("channel")[0].getElementsByTagName("item")
	for item in ri:
		title=str(item.getElementsByTagName("title")[0].childNodes[0].data)
		content=str(item.getElementsByTagName("description")[0].childNodes[0].data)
		print '保存文章('+title+')中...'
		saveFile(title,content)

#處理
def BaiduHi(RS):
	for rs in RS:
		print '加載用戶:'+rs+'(http://hi.baidu.com/'+rs+'/rss)...'
		getRssInfo(r'http://hi.baidu.com/'+rs+'/rss','gb2312')
		print '用戶:'+rs+'處理完畢。\n'
		
def SohuBlog(RS):
	for rs in RS:
		print '加載用戶:'+rs+'(http://'+rs+'.blog.sohu.com/rss)...'
		getRssInfo(r'http://'+rs+'.blog.sohu.com/rss','utf-8')
		print '用戶:'+rs+'處理完畢。\n'
		
#RSS服務器列表
RssServer=['mqycn','yilin','loveinmyhome','guojing021','900ip','037123']
BaiduHi(RssServer)

RssServer=['appler969','saber-bing','02040229','seahai','satanqueen','douzwang']
SohuBlog(RssServer)

現在就可以采集以上一個百度hi用戶的最新博文了。呵呵,核心還是RSS。

===============================================================
使用說明:讀取RSS,并生成記錄到本地。
索引文件為index.txt。每條新聞記錄為一行。對應的內容文件為data/{md5(文章名)}.txt

===============================================================
更新日期:2009-12-13
添加了是否讀取的判斷,如果讀取,則不再采集

===============================================================
更新日期:2009-12-24
修改了部分編碼。解決了UTF-8出粗的問題。
添加了搜狐博客的測試代碼。

可以方便的給DOM對象添加方法,可支持所有瀏覽器

Test
Test
/*
文件名:set-Object.html
設計者:苗啟源
功  能:可以方便的給DOM對象添加方法,可支持所有瀏覽器
主  頁:http://www.okfdzs1809.com/p/set-Object
*/
var $=function(id){return document.getElementById(id);}
//SetObject 設置對象屬性
var setObject=function(c,d){for(p in d){c[p]=d[p];if(p=="init")c.init();}return c;}
//擴展屬性
var __isIE=function(){return window.ActiveXObject}
var __Name=function(t){if(this.tmp)this.name=this.tmp;else this.name='Hello'}
var __setClass=function(t){if(__isIE){this.className=t}else{this.setAttribute('class',t);}}
var __getClass=function(){if(__isIE){return this.className}else{return this.getAttribute('class');}}

//測試對象
var ob=$("Demo");var ob2=$("Demo2");
setObject(ob,{tmp:'Demo',init:__Name,setClass:__setClass,getClass:__getClass});
setObject(ob2,{init:__Name,setClass:__setClass,getClass:__getClass});
document.write(ob.name+"\n");
document.write(ob2.name+"\n");
document.write(ob.getClass()+"\n");
document.write(ob2.getClass()+"\n");
ob.setClass('newDemoClass');
ob2.setClass('newDemo2Class');
document.write(ob.getClass()+"\n");
document.write(ob2.getClass()+"\n");

W3C-DOM簡要文檔

下面時程序生成,測試頁面:http://www.okfdzs1809.com/products/w3c-dom.htm
這里就不截圖了

W3C簡要文檔
動態創建內容時所用的W3C DOM屬性和方法
方法:document.createElement(tagName)
說明:創建指定元素
方法:document.createTextNode(文本)
說明:創建文本節點
方法:_dom.appendChild(子元素)
說明:添加新節點
方法:_dom.getAttribute(屬性名)
說明:返回元素的屬性
方法:_dom.setAttribute(屬性名,屬性值)
說明:設置元素屬性
方法:_dom.inserBefore(新元素,子元素)
說明:在字節點前插入元素
方法:_dom.removeAttribute(屬性名)
說明:刪除屬性
方法:_dom.removeChild(子元素)
說明:刪除節點
方法:_dom.replaceChild(新元素,子元素)
說明:替換節點
方法:_dom.hasChildNodes()
說明:是否有子元素
用于處理XML文檔的DOM元素屬性
方法:childNotes
說明:返回所有子元素的數組
方法:fristChild
說明:第一個下級元素
方法:lastChild
說明:最后一個下級元素
方法:nextSibling
說明:下一個元素
方法:previousSibling
說明:上一個元素
方法:nodeValue
說明:指定元素的讀寫屬性
方法:parentNode
說明:返回元素的父節點
用于遍歷XML文檔的DOM元素方法
方法:getElementById(ID名)
說明:根據ID獲取DOM對象
方法:getElementsByTagName(TagName)
說明:根據TagName返回對象數組
方法:getElementsByName(Name)
說明:根據Name返回對象數組
方法:hasChildNodes()
說明:判斷是否有子元素
方法:getAttribute(屬性名)
說明:返回元素的屬性
版權所有:苗啟源

document的使用方法

屬性 描述
activeElement 獲取當父 document 擁有焦點時獲得焦點的對象。
alinkColor 設置或獲取元素中所有激活鏈接的顏色。
bgColor 不贊成。設置或獲取表明對象后面的背景顏色的值。
charset 設置或獲取用于解碼對象的字符集。
cookie 設置或獲取 cookie 的字符串值。
defaultCharset 從當前的區域語言中獲取默認字符集。
designMode 設置或獲取表明文檔是否可被編輯的值。
dir 設置或獲取表明對象的閱讀順序的值。
doctype 獲取與當前文檔關聯的文檔類型聲明。
documentElement 獲取對文檔根結點的引用。
domain 設置或獲取文檔的安全域名。
expando 設置或獲取表明是否可對象內創建任意變量的值。
fgColor 設置或獲取文檔的前景(文本)顏色。
fileCreatedDate 獲取文件創建的日期。
fileModifiedDate 獲取文件上次修改的日期。
fileSize 獲取文件大小。
implementation 獲取當前文檔的 implementation 對象。
lastModified 獲取頁面上次修改的日期,若頁面提供的話。
linkColor 設置或獲取對象文檔鏈接的顏色。
parentWindow 獲取容器對象所在窗口的引用。
protocol 設置或獲取 URL 的協議部分。
readyState 獲取表明對象當前狀態的值。
referrer 獲取將用戶引入當前頁面的位置 URL。
uniqueID 獲取為對象自動生成的唯一標識符。
URL 設置或獲取當前文檔的 URL。
URLUnencoded 獲取文檔的 URL,去除所有字符編碼。
vlinkColor 設置或獲取用戶已訪問過的鏈接顏色。
XMLDocument 獲取對由對象引出的的 XML 文檔對象模型(DOM)的引用。
XSLDocument 獲取對 XSL 文檔的頂層結點的引用。

屬性

集合

集合 描述
all 返回對象所包含的元素集合的引用。
anchors 獲取所有帶有 name 和/或 id 屬性的 a 對象的集合。此集合中的對象以 HTML 源順序排列。
applets 獲取文檔中所有 applet 對象的集合。
childNodes 獲取作為指定對象直接后代的 HTML 元素和 TextNode 對象的集合。
embeds 獲取文檔中所有 embed 對象的集合。
forms 獲取以源順序排列的文檔中所有 form 對象的集合。
frames 獲取給定文檔定義或與給定窗口關聯的文檔定義的所有 window 對象的集合。
images 獲取以源順序排列的文檔中所有 img 對象的集合。
links 獲取文檔中所有指定了 HREF 屬性的 a 對象和所有 area 對象的集合。
namespaces 獲取 namespace 對象的集合。
scripts 獲取文檔中所有 script 對象的集合。
styleSheets 獲取代表與文檔中每個 link 或 style 對象的實例相對應的樣式表的 styleSheet 對象的集合。

事件

事件 描述
onactivate 當對象設置為活動元素時觸發。
onbeforeactivate 對象要被設置為當前元素前立即觸發。
onbeforecut 當選中區從文檔中刪除之前在源對象觸發。
onbeforedeactivate 在 activeElement 從當前對象變為父文檔其它對象之前立即觸發。
onbeforeeditfocus 在包含于可編輯元素內的對象進入用戶界面激活狀態前或可編輯容器變成控件選中區前觸發。
onbeforepaste 在選中區從系統剪貼板粘貼到文檔前在目標對象上觸發。
onclick 在用戶用鼠標左鍵單擊對象時觸發。
oncontextmenu 在用戶使用鼠標右鍵單擊客戶區打開上下文菜單時觸發。
oncontrolselect 當用戶將要對該對象制作一個控件選中區時觸發。
oncut 當對象或選中區從文檔中刪除并添加到系統剪貼板上時在源元素上觸發。
ondblclick 當用戶雙擊對象時觸發。
ondeactivate 當 activeElement 從當前對象變為父文檔其它對象時觸發。
ondrag 當進行拖曳操作時在源對象上持續觸發。
ondragend 當用戶在拖曳操作結束后釋放鼠標時在源對象上觸發。
ondragenter 當用戶拖曳對象到一個合法拖曳目標時在目標元素上觸發。
ondragleave 當用戶在拖曳操作過程中將鼠標移出合法拖曳目標時在目標對象上觸發。
ondragover 當用戶拖曳對象劃過合法拖曳目標時持續在目標元素上觸發。
ondragstart 當用戶開始拖曳文本選中區或選中對象時在源對象上觸發。
ondrop 當鼠標按鈕在拖曳操作過程中釋放時在目標對象上觸發。
onfocusin 當元素將要被設置為焦點之前觸發。
onfocusout 在移動焦點到其它元素之后立即觸發于當前擁有焦點的元素上觸發。
onhelp 當用戶在瀏覽器為當前窗口時按 F1 鍵時觸發。
onkeydown 當用戶按下鍵盤按鍵時觸發。
onkeypress 當用戶按下字面鍵時觸發。
onkeyup 當用戶釋放鍵盤按鍵時觸發。
onmousedown 當用戶用任何鼠標按鈕單擊對象時觸發。
onmousemove 當用戶將鼠標劃過對象時觸發。
onmouseout 當用戶將鼠標指針移出對象邊界時觸發。
onmouseover 當用戶將鼠標指針移動到對象內時觸發。
onmouseup 當用戶在鼠標位于對象之上時釋放鼠標按鈕時觸發。
onmousewheel 當鼠標滾輪按鈕旋轉時觸發。
onmove 當對象移動時觸發。
onmoveend 當對象停止移動時觸發。
onmovestart 當對象開始移動時觸發。
onpaste 當用戶粘貼數據以便從系統剪貼板向文檔傳送數據時在目標對象上觸發。
onpropertychange 當在對象上發生對象上發生屬性更改時觸發。
onreadystatechange 當對象狀態變更時觸發。
onresizeend 當用戶更改完控件選中區中對象的尺寸時觸發。
onresizestart 當用戶開始更改控件選中區中對象的尺寸時觸發。
onselectionchange 當文檔的選中狀態改變時觸發。
onstop 當用戶單擊停止按鈕或離開 Web 頁面時觸發。

方法

方法 描述
attachEvent 將指定函數綁定到事件,以便每當該事件在對象上觸發時都調用該函數。
clear 目前尚未支持。
close 關閉輸出流并強制將數據發送到顯示。
createAttribute 以指定名稱創建 attribute 對象。
createComment 以指定數據創建 comment 對象。
createDocumentFragment 創建一個新文檔。
createElement 為指定標簽創建一個元素的實例。
createEventObject 生成當使用 fireEvent 方法時用于傳遞事件相關信息的 event 對象。
createStyleSheet 為文檔創建樣式表。
createTextNode 從指定值中創建文本字符串。
detachEvent 從事件中取消指定函數的綁定,這樣當事件觸發時函數就不會收到通知了。
elementFromPoint 返回指定 x 和 y 坐標的元素。
execCommand 在當前文檔、當前選中區或給定范圍上執行命令。
focus 使得元素得到焦點并執行由 onfocus 事件指定的代碼。
getElementById 獲取對 ID 標簽屬性為指定值的第一個對象的引用。
getElementsByName 根據 NAME 標簽屬性的值獲取對象的集合。
getElementsByTagName 獲取基于指定元素名稱的對象集合。
hasFocus 獲取表明對象目前是否擁有焦點的值。
mergeAttributes 復制所有讀/寫標簽屬性到指定元素。
open 此方法以兩種方式工作。該方法打開一個文檔用于收集 write 和 writeln 方法的輸出。在這種情況下,只使用前兩個參數 url 和
name。若指定了附加參數,此方法將打開一個窗口,這與 window 對象的 window.open 方法相同。
queryCommandEnabled 返回表明指定命令是否可于給定文檔當前狀態下使用 execCommand 命令成功執行的 Boolean 值。

queryCommandIndeterm 返回表明指定命令是否處于模糊狀態的 Boolean 值。
queryCommandState 返回表明命令當前狀態的 Boolean 值。
queryCommandSupported 返回表明當前命令是否在當前區域上支持的 Boolean 值。
queryCommandValue 返回文檔、范圍或當前選中區對于給定命令的當前值。
recalc 重新計算當前文檔中的全部動態屬性。
releaseCapture 釋放當前文檔中對象的鼠標捕捉。
setActive 設置對象為當前對象而不將對象置為焦點。
write 在指定窗口的文檔中寫入一個或多個 HTML 表達式。
writeln 在指定窗口的文檔中寫入一個或多個 HTML 表達式,后面追加一個換行符。

對象

元素 對象 描述
BODY body 指定文檔主體的開始和結束。
implementation 包含了關于對象支持的模塊信息。
location 包含關于當前 URL 的信息。
selection 代表了當前激活選中區,即高亮文本塊,和/或文當中用戶可執行某些操作的其它元素。
TITLE title 包含文檔的標題。

樣式

樣式屬性 描述
compatMode 設置或獲取表明此對象是否應用標準兼容模式的值。

注釋

此對象在 Microsoft® Internet Explorer 3.0 的腳本中可用。

使用 document 對象可以對 HTML 文檔進行檢查、修改或添加內容,并處理該文檔內部的事件。在 Web 頁面上,document 對象可通過
window 對象的 document 屬性引用,或者直接引用。

document 對象在主文檔的任意時間均可用,但是對于目前正在輕便動態 HTML(DHTML) 行為中使用的 HTML
組件(HTC)來說卻不可用。這是因為輕便的行為僅當在 HTC 文件中不使用 document
對象時才可被定義。結果將使得輕便的行為比常規行為運行更加快速和有效率。但是,輕便的 DHTML 行為可以與常規的 DHTML
行為一樣的方法訪問主文檔的 document 對象。

ondocumentready 事件將通知 DHTML 行為包含該行為的主 Web 頁面的 document 對象可用。只要
ondocumentready 被觸發,行為就可以開始處理主 document 屬性。

行為中的腳本可以在 HTC 或主文檔中引用 document 對象。如果要在 HTC 文件中編碼腳本,應使用 element.document
來引用主文檔的 document 對象。

示例

下面的例子使用了 document 對象檢查文檔標題并在消息框中顯示該標題(如果非空)。

if (document.title!=””)
alert(“標題為 ” + document.title)

下面的例子演示了在瀏覽器的狀態欄上顯示鼠標當前位置的事件句柄函數,所得位置相對于文檔的左上角。

顯示示例

<HTML>
<HEAD><TITLE>報告鼠標移動</TITLE>
<SCRIPT LANGUAGE=”JScript”>
function reportMove()
{
window.status = “X=” + window.event.x + ” Y=” + window.event.y;
}
</SCRIPT>
<BODY onmousemove=”reportMove()”>
<H1>歡迎!</H1>
</BODY>
</HTML>

標準信息

沒有應用于此對象的公共標準。

應用到

[ 對象名稱 ]
平臺 版本
Win32:
Unix:
Win16:
WinCE:
Mac:
版本數據當鼠標指向鏈接或鏈接獲得焦點時在此列出。
CUSTOM, window
將鼠標光標移動到應用到清單中的元素即可顯示關于列出平臺的可用信息。

能輕松加入FLASH,獲取URL提交的數據,獲取DOM對象并能輕松修改ClassName的JS框架:myw3sys

還有一片關于文件搜索的文章要發,準備測試截圖的時候忽然想到了前幾天些個一個JS框架,也發上來
測試地址為:http://labs.myw3.cn/JS/myw3sys/
文件下載地址:http://labs.myw3.cn/js/resource/myw3sys.js

通過該JS框架,可以:
1,通過_Swf("wjgww.swf",320,240,2);在網頁中插入一個wjgww.swf的Flash文件
2,使用_Query("a")來獲取通過GET提交的a對應數據
3,用_Get("li","tagname",_Get("das"))[0]來獲取ID為das的第一個tagname為li的子對象
4,用_Get("dax").Class.add("x1")來修改classname,實現超炫的效果

/*

MyW3 Js Tools Kit 1.0

更新說明:
1.Swf添加了透明支持
2.增加了_Get對象
3.增加了修改Class函數
4.增加了Query查詢GET提交的數據

函數:_Swf(s,w,h,d,i)
功能:加載SWF文件;
用法:_Swf(Flash文件名,寬,高,文件背景是否透明,FlashURI);
寬高:可以是數字,也可以為站父對象的百分比(如:100%),可以省略,默認100%;
文件背景是否透明:1為透明,其他未不透明,可以省略,默認透明;
FlashURI:Flash默認的保存路徑,可以省略,默認未myw3_res指定的路徑;

函數:_Get(o,t,p)
功能:獲取DOM對象;
用法:_Get(對象標識,標識類型,父對象);
對象標識:根據標識類型根據對象標識獲取對象;
標識類型:id、tagname、name,可以省略,默認id;
父對象:可以省略,默認documet;

函數:_Query(key)
功能:查詢GET提交的數據;
用法:_Query(關鍵字);

函數:o.Class.add(classname),o.Class.get(),o.Class.remove(classname)
功能:添加/刪除/查看對象的ClassName
用法:_Class(對象).add(Class名稱),_Class(對象).get(),_Class(對象).remove(Class名稱)

請尊重作者的勞動成果,保存下面的版權連接
版權所有:MyW3

*/
var myw3=new myw3sys();
var myw3_res=”/Js/resource/”; //資源文件的默認路徑
var _Myw3_QueryData=new Array();

function myw3sys(){
this.cn=new function(){
this.ver=”1.00.0710″;
this.sid=”80710″
this.home=new function(){
this.name=”MyW3 Js Tools Kit”
this.url=”http://labs.myw3.cn/js/resource/myw3sys.js”
this.homesite=”http://labs.myw3.cn/js/myw3sys/”
this.GoHome=function(){location.href=this.homesite;}
this.Download=function(){location.href=this.url;}
return this.url;
}
}
this.cn_query=function(_q){
if(_Myw3_QueryData.length==0)
__CreateQueryDate();
for(i=0;i<_Myw3_QueryData.length;i++){
if(_Myw3_QueryData[i][0]==_q){
return _Myw3_QueryData[i][1];
}
}
}
this.cn_class=new function(){
var q=(window.ActiveXObject)?”className”:”class”;
this.q=q;
this.add=function(c){
if(this.get()&&this.get()!=”undefined”){
if(this.get().indexOf(c)==-1)
tmp=this.get()+” “+c;
}else{
tmp=c;
}
po.setAttribute(q,tmp);
}
this.remove=function(c){
if(this.get()){
var tmp=this.get();
tmp=tmp.replace(” “+c,””);
tmp=tmp.replace(c+” “,””);
if(this.get().indexOf(” “)==-1){tmp=tmp.replace(c,””);}
}
po.setAttribute(q,tmp);
}
this.get=function(){
return po.getAttribute(q);
}
}
this.cn_swf=function(s,w,h,d,i){
s=s.replace(“fla”,”swf”);
if(!w)
w=”100%”;
if(!h)
h=”100%”;
if(!d)
d=1;
//d==0?transparent:Opaque;
if(!i)
//默認的FlashURI
i=myw3_res;
d=d==1?”transparent”:”Opaque”;
document.writeln(‘‘);
}
this.cn_get=function(o,t,p){
if(!p)
p=document;
switch(t){
case “name”:po=p.getElementsByName(o);break;
case “tagname”:po=p.getElementsByTagName(o);break;
default:po=document.getElementById(o);break;
}
if(po){
po.Class=new _Class;
}
return po;
}
}
function __CreateQueryDate(){
var _Myw3_QueryData_S=location.search;
if(_Myw3_QueryData_S!=””){
var _Myw3_QueryData_Ss=_Myw3_QueryData_S.replace(“?”,””).split(“&”);
for(var i=0;i<_Myw3_QueryData_Ss.length;i++){
var MyW3_QueryData_Sa=_Myw3_QueryData_Ss[i].split(“=”);
_Myw3_QueryData[i]=new Array(MyW3_QueryData_Sa[0],MyW3_QueryData_Sa[1])
}
}else{
_Myw3_QueryData[0]=new Array(0,0);
}
}

//_Class請勿修改,否則導致程序不正常
function _Class(){
return myw3.cn_class;
}

function _Swf(s,w,h,d,i){
myw3.cn_swf(s,w,h,d,i);
}

//兼容Beta1.0版本的myw3_swf
function myw3_swf(s,w,h,i){
myw3.cn_swf(s,w,h,1,i);
}

function _Get(o,t,p){
return myw3.cn_get(o,t,p);
}

function _Query(Q){
return myw3.cn_query(Q);
}

function _Help(){
myw3.cn.home.GoHome();
}