【问题标题】:UIWebView retrieve a link and navigate to itUIWebView 检索链接并导航到它
【发布时间】:2013-03-10 09:13:05
【问题描述】:

我正在向我的应用程序添加一个UIWebView,它应该加载一个受密码保护的网页。然后它应该自动从该页面中选择一个链接并导航到该页面。该网站不断更改其链接,因此无法选择目标页面的 URL。我需要先登录,然后从主页中选择一个链接。

登录后如何编写代码来搜索我的主页并导航到所需的链接?

【问题讨论】:

    标签: javascript ios objective-c uiwebview nsregularexpression


    【解决方案1】:

    您可以使用 Javascript 通过其 id 检索链接,然后加载它:

    [yourWebView stringByEvaluatingJavaScriptFromString:@"document.getElementById('yourLinkID').click();"];
    

    要查找链接的 id 是什么,请检查页面上的 html 标记以获取 id 属性的值。

    【讨论】:

      【解决方案2】:

      我认为Regular Expressions 会有所帮助。

      //NSError will handle errors
      NSError *error;
      //Create URL for you page. http://example.com/index.php just an example
      NSURL *pageURL = [NSURL URLWithString:@"http://example.com/index.php"];
      //Retrive page code to parse it using regex
      NSString *pageHtml = [NSString stringWithContentsOfURL:pageURL           
                                                    encoding:NSUTF8StringEncoding 
                                                       error:&error];
      if (error)
      {
          NSLog(@"Error during retrieving page HTML: %@", error);
          //Will terminate your app
          abort();
          //TODO: handle connection error here
      }
      error = nil;
      //Creating regex to parsing page html
      //Information about regex patters you can easily find.
      NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:@"<a[^>]*href=\"([^\"]*)\"[^>]*>mylink</a>"
                                                                        options:NSRegularExpressionCaseInsensitive
                                                                          error:&error];
      if (error)
      {
          NSLog(@"Error during creating regex: %@", error);
          //Will terminate your app
          abort();
          //TODO: handle regex error here
      }
      //Retrieving first match of our regex to extract first group
      NSTextCheckingResult *match = [regex firstMatchInString:pageHtml
                                                      options:0
                                                        range:NSMakeRange(0, [pageHtml length])];
      NSString *pageUrl = [pageHtml substringWithRange:[match rangeAtIndex:1]];
      NSLog(@"Page URL = %@", pageUrl);
      [webView loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:pageUrl]]];
      

      如果您的UIWebView 已经下载了带有 HTML 的页面,您可以替换

      NSURL *pageURL = [NSURL URLWithString:@"http://example.com/index.php"];
      NSString *pageHtml = [NSString stringWithContentsOfURL:pageURL encoding:NSUTF8StringEncoding error:&error];
      

      用这个:

      NSString *pageHtml = [webview stringByEvaluatingJavaScriptFromString:@"document.body.innerHTML"];
      

      【讨论】:

      • 非常感谢您的快速回复。我应该解释说我对编程很陌生。我搜索了有关正则表达式的信息。我是否可以使用它来例如在页面上找到一个名为 mylink 的链接并导航到该链接的不断变化的 url?再次感谢您
      • 链接名称始终保持不变,但该链接的 url 不断变化。
      • 检查编辑的答案。如果此代码不起作用,请发布您的网站网址以进行检查。
      • 非常感谢您的帖子。这正是我正在寻找的东西,并且有很大的帮助!我无法告诉你我有多感激。最好的问候,阿里
      • 嗨,谢尔盖,想知道您是否可以通过相关方式帮助我。我已将正则表达式包含在我的 WebViewDidFinishLoad 方法中,并且一切正常,除非在目标网页导航到之后,似乎存在无限循环并且页面变为空白。当我执行 NSLog 时,它似乎只是无限地重复 WebPageDidFinishLoad 方法。我在这里做错了吗?谢谢
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-06-05
      • 1970-01-01
      • 2015-08-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-15
      • 1970-01-01
      相关资源
      最近更新 更多