【iOS】Regex抓取網頁資料製作小詞典,ios小詞典

來源:互聯網
上載者:User

【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=\\"#\\" >([^<]+)<");
 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.