如何在 CasperJS 中使用 JavaScript 从文档中检索 "just text"
How to retrieve "just text" from the document with JavaScript in CasperJS
我想知道如何使用 JavaScript 选择正文中的纯文本。
它没有名称、ID、标签,只有文本。
Body 没有名字,id 也没有。
如何在 CasperJS 中使用 JavaScript select 这段文字?
这是网站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();
});
我们来鉴定一下这是什么。它是 div 容器内的一个文本节点。 CSS 选择器不会让你走得太远,因为它们只对实际元素起作用,对 TextNode 不起作用。
使用 XPath
您可以使用简单的 JavaScript 方法迭代这些元素,直到到达 TextNode,但我更喜欢 XPath 表达式。 CasperJS 为他们提供了一个辅助工具:
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]
有点棘手。 following-sibling::node()
将匹配当前节点 (h3) 之后类型为 node()
的所有节点(TextNode 属于)。 [1]
只会取第一个。
你可以用 //ui/preceding-sibling::node()[1]
做同样的事情。
和JavaScript
你可以用JavaScript做同样的事情:
var text = casper.evaluate(function(){
return document.querySelector("body > div[align='right'] > h3").nextSibling.textContent;
});
或
var text = casper.evaluate(function(){
return document.querySelector("ui").previousSibling.textContent;
});
我想知道如何使用 JavaScript 选择正文中的纯文本。 它没有名称、ID、标签,只有文本。 Body 没有名字,id 也没有。
如何在 CasperJS 中使用 JavaScript select 这段文字?
这是网站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();
});
我们来鉴定一下这是什么。它是 div 容器内的一个文本节点。 CSS 选择器不会让你走得太远,因为它们只对实际元素起作用,对 TextNode 不起作用。
使用 XPath
您可以使用简单的 JavaScript 方法迭代这些元素,直到到达 TextNode,但我更喜欢 XPath 表达式。 CasperJS 为他们提供了一个辅助工具:
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]
有点棘手。 following-sibling::node()
将匹配当前节点 (h3) 之后类型为 node()
的所有节点(TextNode 属于)。 [1]
只会取第一个。
你可以用 //ui/preceding-sibling::node()[1]
做同样的事情。
和JavaScript
你可以用JavaScript做同样的事情:
var text = casper.evaluate(function(){
return document.querySelector("body > div[align='right'] > h3").nextSibling.textContent;
});
或
var text = casper.evaluate(function(){
return document.querySelector("ui").previousSibling.textContent;
});