如何通过用户脚本获取HTML表格内容?
问题的出现原因:
- 使用jQuery可以更轻松地解析表格。
- 由于需要评分,不要忘记将数字解析为JavaScript整数。
- 如果页面是基于AJAX的,请使用AJAX感知技术。
解决方法:
下面是一个完整的Greasemonkey/Tampermonkey脚本,展示了如何完成所有这些操作:
// ==UserScript==
// _Parse table information that has low information scent.
// http://YOUR_SERVER.COM/YOUR_PATH/*
// http://bilalrammal.ca/clicker/tester.html
// http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// https://gist.github.com/raw/2625891/waitForKeyElements.js
// GM_addStyle
// ==/UserScript==
/*- The directive is needed to work around a design change
introduced in GM 1.0. It restores the sandbox.
*/
waitForKeyElements (".table_lines", parseMilitaryEffectivenessTable);
function parseMilitaryEffectivenessTable (jNode) {
//--- Note that :contains() is case-sensitive.
var strikeAction = jNode.find ("tr:contains('Strike Action') td:eq(1)").text ();
var defensiveAction = jNode.find ("tr:contains('Defensive Action') td:eq(1)").text ();
var spyRating = jNode.find ("tr:contains('Spy Rating') td:eq(1)").text ();
var sentryRating = jNode.find ("tr:contains('Sentry Rating') td:eq(1)").text ();
//--- Convert strings to integers...
strikeAction = parseInt (strikeAction .replace (/\D/g, ""), 10);
defensiveAction = parseInt (defensiveAction.replace (/\D/g, ""), 10);
spyRating = parseInt (spyRating .replace (/\D/g, ""), 10);
sentryRating = parseInt (sentryRating .replace (/\D/g, ""), 10);
//--- Show on console:
console.log ("strikeAction: ", strikeAction);
console.log ("defensiveAction: ", defensiveAction);
console.log ("spyRating: ", spyRating);
console.log ("sentryRating: ", sentryRating);
}
最后一个问题是,如何使其仅定位“军事效能”值为“Strike Action”的td的父级。由于页面上可能还会有其他说“strike action”的内容。
解决方法:
如果有多个具有class为`table_lines`的表格,并且它们都不是“Military Effectiveness”,则调整`waitForKeyElements()`中使用的选择器。例如:`".table_lines:contains('Military Effectiveness')"`是一种方式。如果是其他内容,请提出新的问题。