当前位置: 首页 > 面试题库 >

如何解析DOM(反应)

经景辉
2023-03-14
问题内容

我正在尝试从网站上抓取数据。该网站使用Facebook的React。因此,我可以使用Jaunt解析的源代码与使用Chrome的检查器检查元素时看到的代码完全不同。

我对这一切知之甚少,但是经过一些研究,我认为这与DOM而不是源代码有关。我需要一种方法来使用此DOM代码,因为原始源不包含任何我想要的内容,但我不知道从哪里开始(即使在这里已经阅读了很多答案)。

这是我要抓取的页面之一的示例。例如,要刮擦描述,我想抓住标签之间的内容:

<span class="light-font extended-card-description list-group-item">Example description....</span>

但是正如您所看到的,此元素仅在“ 检查元素 ” 时出现,而在我仅查看页面源代码时则不出现。

我在这里对天才的问题是,我如何才能获取此DOM代码并开始抓取我实际想要的元素?

如果我的术语完全不对,请原谅我,但是正如我所说的,这对我来说是一个全新的领域,我已经尽力了。

提前非常感谢您!


问题答案:

像许多其他Javascript库/框架一样,ReactJS使用客户端代码(Javascript)来呈现最终的HTML。这意味着,当您,Jaunt或浏览器从服务器获取HTML源代码时,它还不包含用户将看到的最终代码。浏览器需要运行页面中包含的Javascript程序,以便生成您希望抓取的最终内容。

对于这种工作,我最喜欢的工具是 CasperJS

它(或CasperJS使用的PhantomJS工具)是一个无头的浏览器,这意味着它是Webkit的一个版本(如Chrome或Safari),已经剥离了所有GUI(窗口,按钮,菜单)。您可以从终端或Java程序运行。它不会在屏幕上显示任何窗口,但是会提取您要求的网页;运行它们包含的任何Javascript;然后响应您的命令,例如“单击此链接”,“给我该文本”,“捕获屏幕截图”,等等。

让我们从一个简单的ReactJS示例开始:

我们想抓取“ Hello John”文本,但是如果您查看纯HTML源(Ctrl+ UAlt+ Ctrl+
U),则不会看到它。另一方面,如果在浏览器中打开控制台并使用以下选择器,则会显示以下文本:

> document.querySelector('#helloExample .playgroundPreview').textContent
"Hello John"

这是执行相同操作的简单CasperJS脚本:

var casper = require("casper").create();

casper.start("http://facebook.github.io/react/index.html", function() {
    this.echo(this.fetchText("#helloExample .playgroundPreview"));
});

casper.run();

您可以将其另存为hello.jscasperjs hello.js在终端上执行,或使用等效的Java代码Runtime.getRuntime().exec(...)

这是一个更好的脚本,它避免了加载图像和第三方资源(例如Facebook按钮,Twitter按钮,Google
Analytics等),从而将加载时间缩短了一半。它还增加了一个waitForSelector步骤,这样我们就不必冒险在ReactJS有机会创建文本之前尝试获取文本。

var casper = require("casper").create({
    pageSettings: {
        loadImages: false
    }
});

casper.on('resource.requested', function(requestData, request) {
    if (requestData.url.indexOf("http://facebook.github.io/") != 0) {
        request.abort();
    }
});

casper.start("http://facebook.github.io/react/index.html", function() {
    this.waitForSelector("#helloExample .playgroundPreview", function() {
        this.echo(this.fetchText("#helloExample .playgroundPreview"));
    });
});

casper.run();

如何安装CasperJS

我在使用PhantomJS和CasperJS的较早版本刮除ReactJS和其他现代Javascript页面时遇到了一些麻烦,因此我建议从GitHub安装PhantomJS
2.0和最新的CasperJS。

对于PhantomJS,您可以下载官方2.0软件包。

对于CasperJS,由于它是Python脚本,因此您应该能够从GitHub检出最新提交并链接bin/casperjs到PATH。这是Linux或Mac
OS X的脚本:

> git clone git://github.com/n1k0/casperjs.git
> cd casperjs
> ln -sf `pwd`/bin/casperjs /usr/local/bin/casperjs

您可能还需要注释掉该行打印Warning PhantomJS v2.0 ...您的bin/bootstrap.js文件。



 类似资料:
  • 支持 jQuery 语法解析 dom,基于 symfony/dom-crawler、symfony/css-selector 实现。 示例 <?php namespace Yurun\CrawlerApp\Module\YurunBlog\Article\Model; use Yurun\Crawler\Module\Parser\Annotation\DomSelect; use Yurun\

  • 问题内容: 我是PHP DOM解析的新手: 我有一个要解析的HTML文件。它有很多这样的DIV: 我正在尝试使用php获取许多div框的内容。如何使用DOM解析器执行此操作? 谢谢! 问题答案: 首先,我必须告诉您,您不能在两个不同的div上使用相同的ID;有一些关于这一点的课程。每个元素应具有唯一的ID。 使用id =“ interestingbox”获取div内容的代码 类的示例: 有关更多详

  • 问题内容: 是的,这个问题相当冗长-抱歉。我保持尽可能的密集。我加粗了问题,以便在阅读整本书之前更容易窥视。 为什么Sax解析比dom解析快? 我唯一能想到的是,使用w / sax可能会忽略大多数传入的数据,因此不会浪费时间处理您不在乎的xml部分。IOW- 使用wx解析后,您无法重新创建原始输入。 如果您编写了SAX解析器,以便它考虑到每个xml节点(从而可以重新创建原始XML解析器),那么它不

  • 前面介绍了很多眼花缭乱的新技术,关于渲染,关于硬件加速,关于布局,关于其他很多,同大家一样,我也花了很多时间来消化它们。本章介绍稍微基础些的话题(本系列的写作顺序完全是随心所欲地),就是在渲染整个过程的初始阶段---HTML解析。不过这不表示它简单,其实这里是非常绕人的。在前面描述渲染过程,其实也是回避了这些方面的很多细节,原因也很简单,我自己也没有完全仔细地了解清楚. :-( 现在又重新阅读和d

  • 主要内容:Java DOM解析器 解析XML文档的步骤,Java DOM解析器 解析XML文档的示例Java DOM解析器 解析XML文档的步骤 以下是使用 DOM解析器 解析文档时使用的步骤。 导入与 XML 相关的包。 创建一个文档生成器。 从文件或流创建文档 提取根元素 检查属性 检查子元素 导入 XML 相关的包 创建一个文档生成器 从文件或流创建文档 提取根元素 检查属性 检查子元素 Java DOM解析器 解析XML文档的示例 项目结构如下: input.xml文件: DomPars