999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

國家圖書館OPAC的MARC頁面數據下載的編程思路

2012-04-29 00:00:00黃曉輝
職業·下旬 2012年5期

摘要:本文討論國家圖書館O(簡稱:國圖)PAC檢索結果的頁面 MARC數據的收集的程序思路,文中的代碼使用C#語言,基于.net框架實現。

關鍵詞:下載國圖CNMARCC#shy;shy;編程

在日常的編目工作中,筆者經常會使用國圖的OPAC,因為國圖的CNMARC數據權威,收藏的圖書種類很齊全,更重要的是任何人都可以免費使用它的檢索服務。圖書館采編室很多時候需要為一批數量可觀的圖書提前準備MARC數據,以為后續的編目工作做好準備,在經費不足而沒有購買收費MARC數據源的情況下,充分利用國圖OPAC的檢索服務進行數據的收集并重新組織成標準MARC數據也許是最佳的數據準備方式。筆者在國圖OPAC檢索結果的CNMARC數據的重新組裝一文中詳細討論了CNMARC記錄的重新組裝的思路,本文將主要討論從國圖檢索結果中下載收集MARC數據的思路。這里主要考慮解決以下三個關鍵的技術問題。一是如何實現最簡化操作方式,也就是說在實際操作中不必頻繁地進行鼠標或鍵盤操作。這是因為就算是簡單的復制粘貼操作,重復數百甚至上千次將是非常繁瑣的事情。二是通過怎樣的邏輯實現直接的結果數據的訪問,也就是說從用戶的角度來看是怎樣才能省略中間的頁面以及結果中不重要的內容。三是對得到的結果數據如何進行處理以及存儲。下面詳細討論。

一、最簡化操作

這也許是最容易解決的技術問題。為了簡化程序的設計,可以選擇ISBN為唯一的檢索關鍵字,在這個前提下,構思并設計出一個ISBN列表文件的導入功能,實現所有圖書ISBN的一次性導入,每次檢索前通過點擊某個按鈕讓程序讀入并顯示下一個ISBN記錄,直到所有ISBN都處理完畢。ISBN列表文件是一個簡單的txt文本文件,文件里每一ISBN占據一行。這樣的實現方式可使效率進一步得到提高,因為省去了每次都要的ISBN輸入操作。但是同時,程序也應該提供單個ISBN輸入的方式,這樣就能保證輸入的靈活性。

二、結果數據的訪問

通過實際的瀏覽器操作,比如檢索ISBN “9787111338017”,選擇“中文文獻”,選擇ISBN字段,確定后瀏覽器導航到結果頁面。觀察結果頁面的URL,可以發現兩個關鍵串:“2R4Q2UBHG9HPDYS2NEL21626DS9AT67SBQ13JGSIFTA3YAMEIE-04983”和“request=9787111338017”。只需確定這兩個串就可以確定整個URL,因為其他都是固定的。更進一步地說,對于前面的加密串,重要的是要確定“-”字符前面的前綴部分。因此,只需保證獲取的加密串的前綴正確就可以構造出整個結果頁面的URL了。為了獲取html頁面的特定內容,需要定義GetPageContent和FindOneMatch兩個靜態方法。基于篇幅考慮,下面僅列出FindOneMatch的代碼:

public static string FindOneMatch(string pageContent, string pat, string groupName){

string res = \"\";

Match m = Regex.Match(pageContent, pat, RegexOptions.IgnoreCase);

if (m.Success){

res = m.Groups[groupName].ToString();

}

return res;

}

GetPageContent方法的簽名為:string GetPage Content(string url, Encoding e),該方法接受URL和一個Encoding對象,訪問指定的URL,以指定的編碼返回頁面內容。FindOneMatch方法接受頁面內容,模式和分組名作為參數,對內容執行一次正則查找,返回匹配的捕獲內容。為了獲取上述的加密串前綴,只需對 “http://opac.nlc.gov.cn/F/”的頁面內容執行一次查找即可。其代碼如下:

string pageContent = GetPageContent(\"http://opac.nlc.gov.cn/F\", Encoding.UTF8);

string pat = \"

]+)\\\" onsubmit\";string token = FindOneMatch(pageContent, pat, \"Token\");

string resultURL=\"http://opac.nlc.gov.cn/F/\" + token +

\"?func=find-bfind_code=ISBrequest=\" +

isbn + fixedPart;

其中的fixedPart為上述討論中結果頁面URL中的其他的不變的部分。

結果頁面訪問的思路已經確定,接下來是獲取MARC內容,這里指的不是標準MARC數據,而是以HTML格式存在的“字段名和指示符—字段內容”的數據。觀察結果頁面的HTML源代碼,可以發現MARC格式以及其他格式的數據顯示是通過用js函數shiftfmt(obj, name)響應點擊事件應用AJAX技術局部更新 details2 節點,并且可以在該函數內發現數據內容的url的構造方法如下:

var url=\"http://opac.nlc.gov.cn:80/F/...?func=full-set-set_bodyset_number=\"+g(\"set_number\").value+\"set_entry=\"+g(\"set_entry\").value+\"format=\"+name;

var host=location.href.replace(/(\\/F\\/.*)/I,'/');

url=url.replace(/http:\\/\\/.*?\\//,host);

上面代碼中的省略號是指前述討論的加密串,而下面兩句代碼是用當前url的主機部分替換構造的url的主機部分。因此,只需確定set_number和set_entry以及format的值就可以構造整個url了。而通過實際觀察發現format的值固定為001,只需要找到set_number和set_entry就可以了。以下是獲取MARC內容的代碼:

string pageContent = GetPageContent(resultURL, Encoding.UTF8);

string pat = @\"\";

string set_number = FindOneMatch(pageContent, pat, \"set_number'\");

pat = @\"\";

string set_entry = FindOneMatch(pageContent, pat, \"set_entry\");

string format = \"001\";

string marcURL = \"http://opac.nlc.gov.cn/F/\" + token +

\"?func=full-set-set_bodyset_number=\" + set_number + \"set_entry=\" +

set_entry + \"format=\" + format;

string marcHtmlContent=GetPageContent(marcURL, Encoding.UTF8);

三、對獲取的MARC內容的處理

獲取到的MARC內容是以以下形式存在的:

字段名和指示符</td>

字段內容</td>

</tr>

同時里面還有可能存在一些HTML特殊字符,如“#39;”,其對應字符為“'”。因此,在提取實際內容前,還需要將HTML特殊字符轉換成相應的字符,但是暫不處理“#60;”和“#62;”(對應字符分別為“<”和“>”)以及“nbsp;”,因為在提取的正則模式串里還要區分HTML標記符號以及后面對“nbsp;” 區分進行處理。為了保存“字段名和指示符—字段內容”形式的數據,需要定義一個NameContent結構:

public struct NameContent{

public readonly string NCKey;//存儲字段名和指示符

public readonly string NCValue;//存儲字段內容

public NameContent (string ncKey, string ncValue){

NCKey = ncKey;

NCValue = ncValue;

}

}

下面是提取內容的方法:

public static List

FindFields(string pageContent, Dictionary htmlSpecialChars){

string convertedPC = ConvertSpecialHtmlChs(pageContent,htmlSpecialChars);

List fields = new List();

string pat = @\"\\s*]*>(?'FieldName' [^<>]*)</td>\\s*]*>(?'FieldContent'[^<>]*)</td>\\s*</tr>\";

MatchCollection ms = Regex.Matches(convertedPC, pat, RegexOptions.IgnoreCase);

for (int i = 0; i < ms.Count; i++){

string sfk = ms[i].Groups[\"FieldName\"].ToString().Replace(\""\",\"\").Trim();

string sfv;

if (sfk.ToUpper() != \"LDR\")

sfv = ms[i].Groups[\"FieldContent\"].ToString().Replace(\""\", \"\").Trim();

else

sfv = ms[i].Groups[\"FieldContent\"].ToString().Replace(\""\", \" \");

sfv = sfv.Replace(\"gt;\",\">\");

sfv = sfv.Replace(\"#62;\", \">\");

sfv = sfv.Replace(\"lt;\",\"<\");

sfv = sfv.Replace(\"#60;\", \"<\");

fields.Add(new NameContent (sfk, sfv));

}

return fields;

}

代碼中的方法string ConvertSpecialHtmlChs(string pageContent, Dictionary htmlSpecialChars)接受頁面內容和一個字典類型的參數htmlSpecialChars,對指定的頁面內容根據提供的htmlSpecialChars字典對HTML特殊字符進行替換,返回替換后的頁面內容。出于對性能的考慮,方法中要使用StringBuilder類型而不是string類型。這里考慮到篇幅有限,不列出該方法的代碼。方法FindFields提取了頁面中有效MARC字段名和相應的內容,返回一個List類型的對象,下面展示了提取并存儲MARC內容的代碼:

Dictionary htmlSpecialChars = new Dictionary();

/*下面省略號中的代碼為向htmlSpecialChars加入html特殊字符對,比如可以從文件讀入*/

List listNC=FindFields(marcHtmlContent, htmlSpecialChars);//提取MARC內容

string marcStr = GetMarcRecord(listNC);//生成MARC記錄

上述代碼中,方法GetMarcRecord(List listNameContent)根據一個List類型的對象生成標準的MARC字符串,這個方法將在前面提到的另一篇文章中討論,最后可以將marcStr追加寫入文件保存,這里不再贅述。

四、結語

本文詳細討論了下載收集國圖OPAC頁面的MARC數據的程序思路,但很多細節還需要在實際代碼里完善,如異常處理、多線程的采用等。此外,出于篇幅的考慮也沒有詳細討論ConvertSpecialHtmlChs等方法,但在主體思路清晰的情況下,這些方法的實現并不困難。

參考文獻:

國家圖書館.新版中國機讀目錄格式使用手冊[M].北京:北京圖書館出版社,2004.

(作者單位:廣東建設職業技術學院)

主站蜘蛛池模板: 国产毛片高清一级国语 | 91精品国产麻豆国产自产在线| 亚洲欧洲国产成人综合不卡| 亚洲欧美在线综合一区二区三区| 91精品小视频| 国产欧美日韩精品综合在线| 97视频免费在线观看| 天天干伊人| 中文字幕调教一区二区视频| 亚洲日韩国产精品综合在线观看| 岛国精品一区免费视频在线观看| 国产69精品久久久久妇女| 国产91在线免费视频| 亚洲天堂精品视频| 好紧太爽了视频免费无码| 亚洲永久免费网站| 大学生久久香蕉国产线观看| 亚洲人妖在线| 露脸一二三区国语对白| 日韩av在线直播| 亚洲国产成人在线| 国产一区二区三区视频| 蜜桃视频一区二区| 91po国产在线精品免费观看| 国产成人精品亚洲日本对白优播| 91视频日本| 亚洲天堂.com| 亚洲成a人片| 精品人妻AV区| 国产欧美性爱网| 欧美中文字幕在线视频| 精品国产网站| 欧美成a人片在线观看| 97在线免费| 久久亚洲中文字幕精品一区| 国产一级毛片yw| 久久久久亚洲AV成人人电影软件| 毛片大全免费观看| 国产麻豆精品在线观看| 99久久国产综合精品2020| 2021最新国产精品网站| 亚洲三级视频在线观看| 一本色道久久88综合日韩精品| 成人午夜免费观看| 无码中字出轨中文人妻中文中| 久久无码av三级| 国产亚卅精品无码| 无码高潮喷水专区久久| 在线欧美日韩国产| 99久久无色码中文字幕| 91精品国产综合久久香蕉922| 久久久91人妻无码精品蜜桃HD | 久久黄色影院| 99久久精品国产自免费| 国产精品福利尤物youwu| 亚洲二三区| 国产丝袜一区二区三区视频免下载| 免费又爽又刺激高潮网址| 欧美色香蕉| 国产精品成人第一区| 午夜免费小视频| 全裸无码专区| 国产精品美女网站| 波多野结衣一区二区三区四区| 美女一区二区在线观看| 波多野结衣无码AV在线| 亚洲v日韩v欧美在线观看| 91蜜芽尤物福利在线观看| 国产www网站| 亚卅精品无码久久毛片乌克兰| 久久永久视频| 国产福利一区二区在线观看| 天天做天天爱夜夜爽毛片毛片| 国产成人免费手机在线观看视频| 久青草国产高清在线视频| 国产精品亚洲一区二区三区z| julia中文字幕久久亚洲| 久久精品中文字幕少妇| 色天天综合久久久久综合片| 久久大香香蕉国产免费网站| 黄色在线网| 2021精品国产自在现线看|