【问题标题】:NodeJs + PhantomJs page content doesn't have all the elementsNodeJs + PhantomJs 页面内容没有所有元素
【发布时间】:2017-08-18 21:52:58
【问题描述】:

您好,我正在尝试解析一个包含实况足球比分的网站。一起使用 NodeJS 和 PhantomJS (phantomjs-node)。问题是我无法在 page.evaluate 中对元素运行 JQuery,因为我假设页面内容没有我想要解析的元素。这里我有一个简单的例子,我看不到的元素叫做“resultsList”。如果我在 Web 浏览器的控制台上运行 $("#resultsList").html(),我可以获得内部 html。

var phantom = require('phantom');

async function getHtml() {
    const instance = await phantom.create([
        "--load-images=false"    
    ]);
    const page = await instance.createPage();

    await page.on("onResourceRequested", function(requestData) {
        console.info('Requesting', requestData.url)
    });

    const status = await page.open('http://www.mackolik.com/canli-sonuclar');
    console.log("STATUS: " + status);

    const content = await page.property('content');
    //console.log(content);

    const result = await page.evaluate(function() {
                        return $("#resultsList").html();
                   });

    console.log("Result : " + result);
    await instance.exit();
};

getHtml();

输出的最新行是

Requesting http://track.adform.net/Serving/TrackPoint/?pm=775868&ADFPageName=Master%20tag&ADFdivider=%7C&ord=192742255982&Set1=en-US%7Cen-US%7C1024x768%7C32&ADFtpmode=3&loc=http%3A%2F%2Fwww.mackolik.com%2FGoogleBanner.htm%3Fv%3D1.150&atdt=.Wa44j1e3NlY5BSo9z4ofjb75PaK4Vpjt3Q9cUVlOrXTAxw63UYOKES5jfyEwHXXTSHCSPxQEt05oaYAhrcpMxE6DBUrizAjVlpSnGmfDnxf7_OLjLnidPZW2AUMnGWVQdgMVQdgGgeVjrkRGjftckcKyAd65hz7YOK2w5ADwIlUjVsYwQ9dvcpxUlzXJJIneGffMfOz77qZoOSix5ezdstlYyxrtSw5DfiPDKOqUhO3f9puqSySy.aPjgnYVuxISg0QirQjEKZtlGqfstpBSKxUC56MnGWpwoNSUC550ial.rIN96h1P38Z_..hw6LzSIrwyMSu_djmVzgzH_y3EjNrjOxCRg9Vr_0p5DtQWug0Jl5mQeQzJQSuX3jtFTL4z1dyJjjNrjOxCUciL4FQmVurNW5BNlYiJ.lY5BqNAE.lTjV..G1
Requesting http://cdn.dimml.io/static/0025b42fc3958ae34c902ccc8164863b1d4b6019.js
STATUS: success
Requesting http://baltar.dimml.io/flow/oiod/0025b42fc3958ae34c902ccc8164863b1d4b6019.js?clientId=2&dom=www.mackolik.com&url=http%3A%2F%2Fwww.mackolik.com%2Fcanli-sonuclar&gemius_sent_once=1
Result : null

如您所见,“结果”打印为 null。

我使用命令>node --harmony-async-await phantomTest.js运行

编辑:网页有 JQuery 库。所以,我不需要使用includeJs() 来添加 JQuery。

Requesting http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js
Requesting http://cm.cdn.md/js5/jquery-ui-1.8.23.custom/js/jquery-ui-1.8.23.custom.min.js
Requesting http://cm.cdn.md/js5/jquery-ui-1.8.20.custom/css/custom-theme/jquery-ui-1.8.20.custom.css
Requesting http://cm.cdn.md/js5/jquery.jsonp-2.1.4.js
Requesting http://cm.cdn.md/js5/jquery-ui-1.8.20.custom/development-bundle/ui/i18n/jquery.ui.datepicker-tr.js
Requesting http://cm.cdn.md/js5/jquery-ui-1.8.20.custom/development-bundle/themes/custom-theme/jquery.ui.datepicker.css
Requesting http://cm.cdn.md/js5/jquery-autocomplete/jquery.autocomplete.min.js

【问题讨论】:

  • 在 page.evalating 之前制作一个屏幕截图 - 您正在寻找的元素是否存在?您还应该在脚本中添加某种错误报告 - 渲染页面时可能会出现错误。
  • 嗯,你是在说 page.render() 函数吗?并且对于错误处理也是针对 page.open() 吗?
  • 我已经在 Opera 中打开了该页面。那里没有#resultsList。也许您需要切换到 iframe 或有错字。
  • 是的,因为该表是用 javascript 构建的。您可以搜索dvScores,它是来自页面源的 div。稍后在 Web 控制台中搜索它,您将在 dvScores div 下看到 resultsList

标签: javascript jquery html node.js phantomjs


【解决方案1】:

有两种可能

  1. 该网站内部没有 jQuery
    解决方法:injectJs("/你系统中jQuery的绝对路径/");

    1. 网站有JQuery 解决方案:找不到特定元素。
      打开 Chrome 执行相同的查询并粘贴到评估中。

【讨论】:

  • 嗨 Vinayka 网站里面有 JQuery,当我从 Chrome 控制台运行时,$("#resultsList").html() 也会返回相关元素
  • 使用 InjectJs 因为 IncludeJs 不能正常工作,因为它只添加脚本而不运行它。
  • 嗯,这样我需要列出 .js 文件对吗?
  • 是的,但是像 Users/folders/list.js 这样的系统路径
  • 哦,好的,我明白了。我会试试的
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-12
  • 2017-05-10
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
相关资源
最近更新 更多