【问题标题】:fastest way to scrape text node with casperjs用 casperjs 抓取文本节点的最快方法
【发布时间】:2013-11-15 16:07:58
【问题描述】:

我有这个结构,我需要像这样从纯文本节点获取文本

<strong><font color="#666666">Phones:</font></strong>
<br>
<br>
<img src="/image/fgh.jpg" title="Velcom" alt="Velcom" style="margin: 2 5 -3 5;">
"+375 29"              //get this
<b>611 77 83</b>      //and this

我尝试使用从 chrome 控制台复制的 XPath

casper.thenOpen('url', function() {
    result = this.getElementInfo(x('//*[@id="main_content"]/table[2]/tbody/tr[17]/td/table/tbody/tr/td[1]/p[1]/text()[3]'));
});

casper.then(function() {
    this.echo(result.text);
});

但它不起作用。另外当我尝试result.data

console.log(this.getElementInfo(x('//*[@id="main_content"]/table[2]/tbody/tr[17]/td/table/tbody/tr/td[1]/p[1]/text()[3]')));

返回null,但是页面中存在这个元素,我查了一下

【问题讨论】:

    标签: javascript dom xpath phantomjs casperjs


    【解决方案1】:

    确保您已包含:

    var x = require('casper').selectXPath;
    

    如果这仍然不起作用,则以下将从页面中检索所有文本,然后您可以解析。不建议这样做以提高性能,但如果您有要解析的锚文本,它确实有效。您需要稍作修改。

    var casper = require("casper").create ({
        waitTimeout: 15000,
        stepTimeout: 15000,
        verbose: true,
        viewportSize: {
            width: 1400,
            height: 768
        },
        onWaitTimeout: function() {
            logConsole('Wait TimeOut Occured');
            this.capture('xWait_timeout.png');
            this.exit();
        },
        onStepTimeout: function() {
            logConsole('Step TimeOut Occured');
            this.capture('xStepTimeout.png');
            this.exit();
        }
    });
    
    casper.on('remote.message', function(msg) {
        logConsole('***remote message caught***: ' + msg);
    });
    
    casper.userAgent('Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_5) AppleWebKit/537.4 (KHTML, like Gecko) Chrome/22.0.1229.94 Safari/537.4');
    
    // vars
    var gUrl           = 'WebAddy'; //+++ Update URL
    
    casper.start(gUrl, function() {
      var tPlainText = this.evaluate(function() {
    
        var bodyText        = document.body;
        var textContent     = bodyText.textContent || bodyText.innerText;
        var tCheck          = textContent.indexOf("Phones:");
    
        if (tCheck === -1) {
          tPlainText = 'Phone Text Not Found';
            return tPlainText;
        } else {
          // parse text
          var tSplit              = textContent.split('Phones:');
          var tStr                = (tSplit[1]) ? tSplit[1] : '';
          var tPos1               = tStr.indexOf(''); //+++ insert text to stop parse 
          var tDesiredText         = (tPos1 !== -1) ? tStr.substring(0, tPos1) : null;
    
            return tDesiredText;
        }
      });
      console.log(tPlainText);
    });
    
    casper.run();
    

    【讨论】:

    • 好吧,var x = require('casper').selectXPath;被包括在内。可能的要点是 casperjs 中的 xpath 不是 文本节点的输出文本。但无论如何,谢谢你的回答。
    【解决方案2】:

    一个老问题,但我有同样的问题。我需要得到以下文本,所以我是这样做的。

    __utils__.getElementByXPath("//bla...bla/following-sibling::node()").textContent;
    

    【讨论】:

      猜你喜欢
      • 2018-03-04
      • 1970-01-01
      • 2012-08-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多