【问题标题】:Retrieve content using two labels with Casperjs使用 Casperjs 的两个标签检索内容
【发布时间】:2017-06-04 19:44:30
【问题描述】:

我刚开始使用 CasperJs,我想检索存储在列表中的当前页码。我认为这可以通过组合 classaria-selected 来完成,这必须为 true 才能指示当前页面。

如果有人能指出如何以编程方式执行此操作,我将不胜感激。 到目前为止,这是我所得到的:

var casper = require("casper").create({
    pageSettings: {
        userAgent: "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:23.0) Gecko/20130404 Firefox/23.0"
    }
});

var url = 'https://markets.ft.com/data/director-dealings';
var currentPage = 1;
var jobs = [];

casper.start(url, function() {
    this.waitForSelector('li[class="mod-ui-pagination__number"]');
});

casper.then(function() {

    var el = document.querySelectorAll('body > div.o-grid-container.mod-container > div:nth-child(2) > section > div:nth-child(1) > div > div > div.mod-ui-pagination__results-count > ul');//div[3] div[2] section div[1] div div div[3] ul li[2]');

    this.echo(JSON.stringify(el)); 
});

casper.run();

HTML:

<ul class="mod-ui-pagination">
    <li class="mod-ui-pagination__arrows" aria-disabled="false"><i class="o-ft-icons-icon o-ft-icons-icon--arrow-left"></i></li>
    <li class="mod-ui-pagination__number" aria-selected="false" data-mod-pagination-num="1">1</li>
    <li class="mod-ui-pagination__number" aria-selected="true" data-mod-pagination-num="2">2</li>
    <li class="mod-ui-pagination__number" aria-selected="false" data-mod-pagination-num="3">3</li>
    <li class="mod-ui-pagination__ellipsis"><i class="o-ft-icons-icon o-ft-icons-icon--more"></i></li>
    <li class="mod-ui-pagination__number" aria-selected="false" data-mod-pagination-num="739">739</li>
    <li class="mod-ui-pagination__number" aria-selected="false" data-mod-pagination-num="740">740</li>
    <li class="mod-ui-pagination__number" aria-selected="false" data-mod-pagination-num="741">741</li>
    <li class="mod-ui-pagination__arrows" aria-disabled="false"><i class="o-ft-icons-icon o-ft-icons-icon--arrow-right"></i></li>
</ul>

PS:是否有快速找到如何访问元素的技巧?检查 > 复制选择器

编辑:检查 > 复制 Xpath 为 ul 元素返回此内容:html/body/div[3]/div[2]/section/div[1]/div/div/div[3]/ul/li[2]

【问题讨论】:

  • 谁能帮帮我?

标签: javascript node.js web-scraping casperjs


【解决方案1】:
  1. 使用evaluate()访问真实页面环境(DOM)
  2. 使用querySelector() 而不是querySelectorAll(),因为您只需要一个元素
  3. 使用这个 CSS 选择器:ul.mod-ui-pagination &gt; li[aria-selected="true"]

这是脚本:

var casper = require('casper').create({
  pageSettings: {
    userAgent: 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.8; rv:23.0) Gecko/20130404 Firefox/23.0'
  }
});

casper.start('https://markets.ft.com/data/director-dealings');

casper.waitForSelector('li.mod-ui-pagination__number', function () {
  this.echo(this.evaluate(function () {
    var el = document.querySelector('ul.mod-ui-pagination > li[aria-selected="true"]');
    return el.textContent;
  }));
});

casper.run();

【讨论】:

  • 我很感激,请您澄清以下几点: 1. 为什么要评估而不是简单地直接访问 DOM? 2. 你是怎么得到 CSS 选择器的?
  • 1.当您在 PhantomJS 或 SlimerJS 上运行 CasperJS 脚本时,您处于特定环境中并且无权访问 DOM。外部evaluatethis 指的是casperevaluate 内部,this 指的是window。您可以了解更多信息here。 2. 我根据您的需要手动构建了这个选择器。 ul.mod-ui-pagination 对定位分页(这是一个列表)很重要。 &gt; 说我们只想要直接的孩子 (li)。最后li[aria-selected="true"]给你选择的li;正是你想要的......
猜你喜欢
  • 1970-01-01
  • 2016-05-15
  • 2019-05-10
  • 2016-12-22
  • 1970-01-01
  • 2015-06-11
  • 2014-05-14
  • 2016-06-14
  • 1970-01-01
相关资源
最近更新 更多