如何用javascript抓取HTMLtable的内容?
How to grab HTML table content with javascript?
我正在创建一个 Greasemonkey 脚本,该脚本从基于文本的游戏中读取信息并将其存储到数据库中以备将来使用。
我想要的是能够读取用户的统计数据并将这些统计数据转化为变量,以便我可以继续使信息变得有用。
这是 table 的源代码,我想从中获取统计信息:
<table width="100%">
<tr>
<td width="50%" valign="top" style="padding-right: 25px;">
<table class="table_lines" width="100%" cellspacing="0" cellpadding="6" border="0">
<tr>
<th colspan="3">Military Effectiveness</th>
</tr>
<tr>
<td><b>Strike Action</b></td>
<td align="right">16,376,469,657</td>
<td align="right">Ranked #443</td>
</tr>
<tr>
<td><b>Defensive Action</b></td>
<td align="right">4,016,716,436</td>
<td align="right">Ranked #569</td>
</tr>
<tr>
<td><b>Spy Rating</b></td>
<td align="right">12,245,896</td>
<td align="right">Ranked #1,204</td>
</tr>
<tr>
<td><b>Sentry Rating</b></td>
<td align="right">5,291,630,090</td>
<td align="right">Ranked #831</td>
</tr>
</table>
现在您可以看到统计数据没有识别 class ID 或任何东西,所以我不确定该怎么做。我只真正使用 PHP,所以 JS 对我来说很新,但它看起来类似于 PHP。
也许是说 "After <td><b>Strike Action</b></td>
, grab the first td value" 然后把它作为一个变量?
注意:打击行动、防御行动、间谍评级和哨兵评级是我需要的变量。
您可以为其分配一个 ID 并使用 getElementById javascript 方法获取它:
HTML
<div id="something">Test</div>
JAVASCRIPT
var value = document.getElementById("something").value;
//value = "Test";
但是,如果您尝试从不属于您自己的页面获取内容,xpath 是一种方法:
function getElement(path) {
return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
var rows = getElement("//html[1]/body[1]/table[@class='table_lines']/tr");
那将是 return 所有 table 行的数组。
list.getElementsByTagName("tag").innerHTML = "html text";
这或许也可以工作
尝试这样的事情(注意你需要使用 jquery 库才能工作)
$(".table_lines").find('tr').each(function (i) {
var $tds = $(this).find('td'),
lable = $tds.eq(0).text(),
value = $tds.eq(1).text(),
rank = $tds.eq(2).text();
// do something with lable, value, rank
alert('Lable: ' + lable + '\nValue: ' + value + '\nRank: ' + rank);
})
- 使用 jQuery 可以更轻松地解析 table。
- 既然你想要评分,请不要忘记将数字解析为 javascript 个整数。
- 如果页面由 AJAX 驱动,请使用 AJAX-aware techniques。
这里是一个完整的Greasemonkey/Tampermonkey脚本,展示了如何完成所有这些:
// ==UserScript==
// @name _Parse table information that has low information scent.
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @include http://bilalrammal.ca/clicker/tester.html
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant 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);
}
我正在创建一个 Greasemonkey 脚本,该脚本从基于文本的游戏中读取信息并将其存储到数据库中以备将来使用。
我想要的是能够读取用户的统计数据并将这些统计数据转化为变量,以便我可以继续使信息变得有用。
这是 table 的源代码,我想从中获取统计信息:
<table width="100%">
<tr>
<td width="50%" valign="top" style="padding-right: 25px;">
<table class="table_lines" width="100%" cellspacing="0" cellpadding="6" border="0">
<tr>
<th colspan="3">Military Effectiveness</th>
</tr>
<tr>
<td><b>Strike Action</b></td>
<td align="right">16,376,469,657</td>
<td align="right">Ranked #443</td>
</tr>
<tr>
<td><b>Defensive Action</b></td>
<td align="right">4,016,716,436</td>
<td align="right">Ranked #569</td>
</tr>
<tr>
<td><b>Spy Rating</b></td>
<td align="right">12,245,896</td>
<td align="right">Ranked #1,204</td>
</tr>
<tr>
<td><b>Sentry Rating</b></td>
<td align="right">5,291,630,090</td>
<td align="right">Ranked #831</td>
</tr>
</table>
现在您可以看到统计数据没有识别 class ID 或任何东西,所以我不确定该怎么做。我只真正使用 PHP,所以 JS 对我来说很新,但它看起来类似于 PHP。
也许是说 "After <td><b>Strike Action</b></td>
, grab the first td value" 然后把它作为一个变量?
注意:打击行动、防御行动、间谍评级和哨兵评级是我需要的变量。
您可以为其分配一个 ID 并使用 getElementById javascript 方法获取它:
HTML
<div id="something">Test</div>
JAVASCRIPT
var value = document.getElementById("something").value;
//value = "Test";
但是,如果您尝试从不属于您自己的页面获取内容,xpath 是一种方法:
function getElement(path) {
return document.evaluate(path, document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
}
var rows = getElement("//html[1]/body[1]/table[@class='table_lines']/tr");
那将是 return 所有 table 行的数组。
list.getElementsByTagName("tag").innerHTML = "html text";
这或许也可以工作
尝试这样的事情(注意你需要使用 jquery 库才能工作)
$(".table_lines").find('tr').each(function (i) {
var $tds = $(this).find('td'),
lable = $tds.eq(0).text(),
value = $tds.eq(1).text(),
rank = $tds.eq(2).text();
// do something with lable, value, rank
alert('Lable: ' + lable + '\nValue: ' + value + '\nRank: ' + rank);
})
- 使用 jQuery 可以更轻松地解析 table。
- 既然你想要评分,请不要忘记将数字解析为 javascript 个整数。
- 如果页面由 AJAX 驱动,请使用 AJAX-aware techniques。
这里是一个完整的Greasemonkey/Tampermonkey脚本,展示了如何完成所有这些:
// ==UserScript==
// @name _Parse table information that has low information scent.
// @include http://YOUR_SERVER.COM/YOUR_PATH/*
// @include http://bilalrammal.ca/clicker/tester.html
// @require http://ajax.googleapis.com/ajax/libs/jquery/2.1.0/jquery.min.js
// @require https://gist.github.com/raw/2625891/waitForKeyElements.js
// @grant GM_addStyle
// ==/UserScript==
/*- The @grant 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);
}