javascript - 尝试获取 HTML 内容时被阻止

标签 javascript html ios objective-c

我正在尝试从网站获取 HTML 内容,但它被 JavaScript 阻止了。

实现如下:

- (void)viewDidLoad
{
  NSURL *htmlUrl = [NSURL URLWithString:@"https://color.adobe.com/explore/most-popular/?time=week"];
  NSStringEncoding htmlEncoding = CFStringConvertEncodingToNSStringEncoding(kCFStringEncodingUTF8);

  NSString *htmlString = [NSString stringWithContentsOfURL:htmlUrl encoding:htmlEncoding error:nil];

  NSLog(@"%@",htmlString);

  NSData *htmlData = [htmlString dataUsingEncoding:NSUTF8StringEncoding];
  TFHpple *htmlHpple = [TFHpple hppleWithHTMLData:htmlData];
}

部分NSLog输出:

    <h1>JavaScript Disabled</h1>
<p>Adobe Color CC requires JavaScript in order to load properly. Please enable JavaScript in your browser and reload the page.</p>
</li>
<li>
  <h1>JavaScript est désactivé</h1>
  <p>Pour pouvoir se charger correctement, Adobe Color CC requiert JavaScript. Veuillez activer JavaScript dans votre navigateur et recharger la page.</p>
  JavaScript ist erforderlich, damit Adobe Color CC ordnungsgemäß geladen wird. Aktivieren Sie JavaScript im Browser und laden Sie die Seite neu.
  </p>
</li>
<li>
  <h1>JavaScript が無効です</h1>
  <p>Adobe Color CC で正しく読み込みを行うには、JavaScript が必要です。ご使用のブラウザーで JavaScript を有効にして、ページを再読み込みしてください。</p>
</li>
<li>
  <h1>JavaScript desactivado</h1>
  <p>Para que Adobe Color CC pueda cargarse correctamente, se requiere JavaScript. Active JavaScript en el navegador y vuelva a cargar la página.</p>
</li>

这不是我想要的。

实际上,当您打开网址时,您会看到很多颜色。这就是我想要解析和获取的内容。

但不是

<h1>JavaScript Disabled</h1> <p>Adobe Color CC requires JavaScript in order to load properly. Please enable JavaScript in your browser and reload the page.</p>

最佳答案

正如我分析并从您提供的 url 中发现的那样,这仅使用简单的 http 请求加载网页的一部分,并使用 ajax 请求加载所有其他部分,如颜色。因此,当您使用简单的
请求代码时 NSString *htmlString = [NSString stringWithContentsOfURL:htmlUrl encoding:htmlEncoding error:nil];

然后它不会为您提供网络浏览器中显示的全部 html 代码,而只提供一小部分。如果你想要整个 html 代码,然后使用 UIWebView 加载 url,然后当 web View 完成加载时,然后使用代码找到 html 字符串

NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];

它会给你整个 html 代码,就像在网络浏览器中看到的那样,现在你可以找到你想要的任何东西。

重要说明:要找到 webView 何时完成 ajax 加载,您必须在 webView 中注入(inject)一些 java 脚本,以便在 ajax 请求完成加载时调用您的委托(delegate)。或者只是为了验证我的代码,您可以简单地使用

dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(20 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
       NSString *htmlString = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"];
    });

当 ajax 请求大约在 20 秒内完成加载时调用您的代码。内部 web View 委托(delegate)方法

- (void)webViewDidFinishLoad:(UIWebView *)webView

希望这就是你想要的,还有一件事,javascript 默认包含在 webView 中,你不需要自己注入(inject)它。

关于javascript - 尝试获取 HTML 内容时被阻止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27198558/

相关文章:

javascript - 当元素为标签 x 时如何执行功能

当 id 在另一个数组中时对象中的 JavaScript 操作

javascript - Logo 未出现在背景图片上的问题

html - CSS:相同的 div,2 种不同的样式(针对不同的子 div)

javascript - HTML Canvas 使用 javascript 旋转文本而不移动背景图像

javascript - 无法获取 JSON Key 的值,仅返回 Key

html - 将一个文本向左浮动,另一个向右浮动

ios - 无法将 TableView 平滑地动画化到底部插入的新单元格

ios - UIScrollView 不会通过自动调整大小来调整大小

ios - 在App Store Connect上不可用的在App Store上查看选项