【iOS】Regex抓取網頁資料製作小詞典,ios小詞典
應用程式不一定要自己去提供資料,有現成的資料學會去用才好。
網路很大,各種搜尋引擎每天到處爬。本文通過Regex抓取網站的資料來做一個小詞典。
一、Regex的使用
1. 確定匹配方案,即pattern
2. 用pattern執行個體化NSRegularExpression
3. 用匹配方法開始匹配。
匹配一次:可以使用firstMatch方法
匹配多次:可以用matchs方法
Regex對照表:(在網上找到了一個很不錯的表,Regex各個語言通用)
http://www.jb51.net/shouce/jquery1.82/regexp.html
下面是測試代碼,能匹配出:xn4545945
//測試Regex用的- (void)findAnswerInHTMLTest { NSString *srcStr = @"http://blog.csdn.net/xn4545945"; NSString *pattern = @"xn[^\\s]*"; //匹配以xn開頭的任何非空白字元//執行個體化Regex,需要指定兩個選項//NSRegularExpressionCaseInsensitive 忽略大小寫//NSRegularExpressionDotMatchesLineSeparators 讓.能夠匹配換行NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators error:nil]; //匹配出結果集NSTextCheckingResult *checkResult = [regex firstMatchInString:srcStr options:NSMatchingReportCompletion range:NSMakeRange(0, srcStr.length)]; // 取出找到的內容.NSString *result = [srcStr substringWithRange:[checkResult rangeAtIndex:0]]; NSLog(@"資料為----->%@", result);}
二、抓取網頁資料,並製作小詞典
用海詞作為查詢詞典抓取資料。http://dict.cn
直接在網址後面拼接查詢詞即可查詢,如查詢“hello”,即http://dict.cn/hello
查看網頁原始碼如: 即抓取出 (打招呼)喂;你好 即可。
tips:
(.*?)來取出想要的內容.括弧括住才能取出.
抓網頁用這個就夠了.*. 表示匹配任一字元**表示重複0到多次*? 表示盡量少的匹配.*將需要取出的用(.*?)代替.大空格換行等用.*?代替,表示忽略.
結合瀏覽器的尋找功能, 在原始碼中尋找,看選取的關鍵詞是否有重複的.(找時更方便)*選取稍微大點的塊(標籤中有id標記的為好),可以做到唯一.(如果選太小,可能一些小標籤在網頁中重複的次數非常多)*然後多次調用Regex方法,逐步縮小範圍.*引號需要轉義(加反斜線).中文需要%轉義.(用方法)
直接上代碼:
@implementation XNSpider- (void)loadHTMLWithWord:(NSString *)word {//1.發送HTML請求, 得到返回的網頁.(轉換為字串)NSString *urlString = [NSString stringWithFormat:@"%@%@", kBaseURL, word]; //拼接請求網址urlString = [urlString stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; //中文轉義NSURL *url = [NSURL URLWithString:urlString]; //得到URLNSURLRequest *request = [NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:5.0f];[NSURLConnection sendAsynchronousRequest:request queue:[NSOperationQueue mainQueue] completionHandler: ^(NSURLResponse *response, NSData *data, NSError *connectionError) { //得到的data資料轉換為字串 NSString *html = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];// NSLog(@"%@", html); //2.從返回的字串中匹配出(Regex過濾)想要的. (另寫一個方法findAnswerInHTML) //然後通過代理傳遞結果給主線程,用於更新UI NSString *result = [self findAnswerInHTML:html]; NSLog(@"%@", result); if ([self.delegate respondsToSelector:@selector(finishSpider:)]) { [self.delegate finishSpider:result]; //將完成後的結果通過代理傳到UI線程中去.}}];}/** * Regex匹配字串的核心方法 * * @param html 輸入的整個網頁字串 * * @return 返回匹配的結果 */- (NSString *)findAnswerInHTML:(NSString *)html {//將需要取出的用(.*?)代替. 大空格換行等用.*?代替,表示忽略.NSString *pattern = @"<ul class=\"dict-basic-ul\">.*?<li><span>(.*?)</span><strong>(.*?)</strong></li>";//執行個體化Regex,需要指定兩個選項//NSRegularExpressionCaseInsensitive 忽略大小寫//NSRegularExpressionDotMatchesLineSeparators 讓.能夠匹配換行NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern options:NSRegularExpressionCaseInsensitive | NSRegularExpressionDotMatchesLineSeparators error:nil];//匹配出結果集NSTextCheckingResult *checkResult = [regex firstMatchInString:html options:NSMatchingReportCompletion range:NSMakeRange(0, html.length)];// 取出找到的內容. 數字分別對應第幾個帶括弧(.*?), 取0時輸出匹配到的整句.NSString *result = [html substringWithRange:[checkResult rangeAtIndex:2]];NSLog(@"資料為----->%@", result);return result;}
匹配結果最後使用代理傳到主線程中去更新UI。程式介面如下:(查詢Android後,從網頁中找到的資料為“機器人”)
出錯處理這裡就不做了。
程式源碼如下:http://download.csdn.net/detail/xn4545945/7619349
轉載請註明出處:http://blog.csdn.net/xn4545945
怎使用Regex抓取網站內容
HTML網頁是一個文字文件,Regex的主要作用是匹配文字文件中的特定字串,當然,它不僅僅是從文檔中找出一個確定的字串,例如“text”這麼簡單,而是使用一種很靈活的詞法表達一個字串模式,按照這個模式比對。
從HTML文檔中提取內容,可以將HTML的標籤或者文字內容作為匹配的目標和參照,所以首先要瞭解目標HTML文檔結構,另外,Regex也比較不容易掌握。實際上,HTML文檔是一種半結構化的文檔,用HTML標籤分成結構塊,所以,還有另外一種提取途徑:使用XPath或者XQuery,其文法要容易掌握得多。
可以看一下MetaSeeker網站抓取軟體的實現原理,採用以XPath為主,以字串處理函數為輔的方法提取網站內容,在GooSeeker網站上有很多技術資料,軟體可以免費下載和使用
Regex抓取網頁內容
Pattern p = Pattern.compile("([\\d-]+)<\\/span><a onclick=\\"openWin\\('([^']+)'\\)\\" href=\\"#\\" >([^<]+)<");