我想知道如何使用JavaScript在正文中选择纯文本。 它没有名称,标识,标签,只有文字。 身体也没有名字,也是。
如何在CasperJS中使用JavaScript选择此文本?
这是网站html
<html>
<head>
<title>site title</title>
</head>
<body>
<p>I don't want to scraping here</p>
<div align="right">
<a href="/html/blabla.html">TOP</a> <a href="/html/list.html">一つ戻る</a>
</div>
<h3>I don't want to scraping here too <a href="/html/blabla.html"><font size="3">abcdef</font></a></h3>
***"
2015年07月16日 10時50分時点" <---------I want to scrape here!!!!***
<br>
<ui>..</ui>
<br>
<div align="right">
<a href="/html/blabla.html">TOP</a> <a href="/html/list.html">一つ戻る</a>
</div>
<hr size="1">
<div align="center" style="padding:5px 0px;">(c)company name</div>
</body>
</html>
这是我的代码
var casper = require('casper').create({
clientScripts: ["includes/jquery-2.1.3.min.js"],
verbose: true,
logLevel: 'debug',
pageSettings: {
webSecurityEnabled: false
}
});
var fs = require('fs');
var rli;
var result = null;
var pattern = /<[^>]+>/g;
var rui;
var list;
var result;
casper.start();
casper.then(function() {
var current = 1;
var end = 2;
for (;current < end;) {
(function(cntr) {
casper.thenOpen('http://site/0'+cntr+'/' , function() {
this.echo('casper.async: '+cntr+casper.getCurrentUrl());
// here we can download stuff
lists = this.evaluate(function () {
var elements = document.querySelectorAll('ui'); // scraping ui is okay
result= Array.prototype.map.call(elements, function (element) {
return element.innerText + ' [ ***here I want to save the upper date data*** ]'; //
});
return result;
});
this.echo(lists.length);
this.echo(lists.join('\n'));
// casper.capture( 'capture'+cntr+'.png' );
fs.write('results'+cntr+'.txt', lists);
});
})(current);
current++;
}
});
casper.run(function() {
this.echo('Done.').exit();
});
答案 0 :(得分:3)
让我们确定这是什么。它是div容器内的文本节点。你不会对CSS选择器有所了解,因为它们只适用于实际元素,而不适用于TextNodes。
您可以使用简单的JavaScript方法迭代这些元素直到您到达TextNode,但我更喜欢XPath表达式。 CasperJS为他们提供了一个帮助工具:
_textField.placeholder = @"Enter Something";
表达式大多是不言自明的。第一部分(var x = require('casper').selectXPath;
...
var text = casper.fetchText(x("//body/div[@align='right']/h3/following-sibling::node()[1]"));
casper.echo(text);
)直接匹配您要检索的文本之前的//body/div[@align='right']/h3
元素。 <h3>
有点棘手。 following-sibling::node()[1]
将匹配当前节点(h3)之后的following-sibling::node()
类型的节点(TextNode所属的节点)。 node()
只接受第一个。
您可以使用[1]
执行相同的操作。
你可以用JavaScript做同样的事情:
//ui/preceding-sibling::node()[1]
或
var text = casper.evaluate(function(){
return document.querySelector("body > div[align='right'] > h3").nextSibling.textContent;
});