从html提取信息greasemonkey
因此,我正在尝试编写一个greasemonkey脚本,以便在我的网络游戏中放置拼贴。我已经知道了拼贴拼贴,但为了扩展脚本,我需要将循环限制为移动次数。我想不通,从页面的HTML中提取此信息的最佳方式:我只是在寻找如何解决此兽指针从html提取信息greasemonkey
<h2>5</h2>Level:<font size="4px" color="red"> 1455</font><br><br>Moves:<font size="4px" color="red"> 0</font><br>Total:<font size="4px" color="red"> 688</font><br><br><a href="logout.php">
。正则表达式?
编辑:对于这个div完整的代码
<div id="info">
<img src="images/mmosbg_title.png" onclick = "getinfo('boardinfo.php', 'info')"; height="48" width="138" border="0"><br><br><a href="board5.php?size=5&border=0"><img src="boxes/990000.gif" border="0" width="5 px" height="5 px" onmouseover="Tip('Micro Board Size', BGCOLOR, '#FFCC00', WIDTH, -200, OPACITY, 95, SHADOW, true, SHADOWWIDTH, 7)" onmouseout="UnTip()"></a><a href="board5.php?size=10&border=0"><img src="boxes/990000.gif" border="0" width="10 px" height="10 px" onmouseover="Tip('Small Board Size', BGCOLOR, '#FFCC00', WIDTH, -200, OPACITY, 95, SHADOW, true, SHADOWWIDTH, 7)" onmouseout="UnTip()"></a><a href="board5.php?size=16"><img src="boxes/990000.gif" border="0" width="16 px" height="16 px" onmouseover="Tip('Medium Board Size', BGCOLOR, '#FFCC00', WIDTH, -200, OPACITY, 95, SHADOW, true, SHADOWWIDTH, 7)" onmouseout="UnTip()"></a><a href="board5.php?size=32"><img src="boxes/990000.gif" border="0" width="32 px" height="32 px" onmouseover="Tip('Large Board Size', BGCOLOR, '#FFCC00', WIDTH, -200, OPACITY, 95, SHADOW, true, SHADOWWIDTH, 7)" onmouseout="UnTip()"></a><h2>5</h2>Level:<font size="4px" color="red"> 1455</font><br><br>Moves:<font size="4px" color="red"> 0</font><br>Total:<font size="4px" color="red"> 688</font><br><br><a href="logout.php"><img src="images/logout.png" border="0" onmouseover="Tip('Logout', BGCOLOR, '#FFCC00', WIDTH, -200, OPACITY, 95, SHADOW, true, SHADOWWIDTH, 7)" onmouseout="UnTip()"></a><a href="history.php"><img src="images/pastwinners.png" border="0" onmouseover="Tip('Past Winners', BGCOLOR, '#FFCC00', WIDTH, -200, OPACITY, 95, SHADOW, true, SHADOWWIDTH, 7)" onmouseout="UnTip()"></a><br><br><font color="red" font="5px">Current Rankings</font><img src="images/questionsmall.png" onmouseover="Tip('Current Rankings<br>(rank)(name)(total)(moves)', BGCOLOR, '#FFCC00', WIDTH, -300, OPACITY, 95, SHADOW, true, SHADOWWIDTH, 7)" onmouseout="UnTip()"></a><br><br><font color="red">1530</font> of 1600 (96 %)<br><br>1 <font color="red">iannis5</font> <font color="red">795</font> <font color="black">292</font><br><img src="boxes/0000CD.gif" width="16" height="16" ><br>2 <font color="black">5</font> <font color="red">688</font> <font color="black">0</font><br><img src="boxes/990000.gif" width="16" height="16" ><br>3 <font color="darkred">yellowfestiva5</font> <font color="red">47</font> <font color="black">6</font><br><img src="boxes/FFDAB9.gif" width="16" height="16" ><br>
</div>
这是丑陋的,我知道。
该问题的HTML看起来可疑畸形和不完整。什么是包含所有的节点?
总之,从HTML差提取信息,您可以用钝力正则表达式的快速和肮脏的解决方案:
var moves = 0;
var movesMatch = document.body.textContent.match (/Moves:\s*(\d+)(?:\D)/);
if (movesMatch && movesMatch.length > 1) {
moves = parseInt (movesMatch[1], 10);
}
console.log ("The number of moves left is: ", moves);
而这可能会在这种情况下工作,但它的脆性(可能“找到“错误的信息),除了最简单的页面。
的最佳工艺是与DOM技术,尽可能缩小文本:
-
确定独特且耐用的节点,如果可能的话,那最好包含所需信息或者是以稳定的方式靠近它。
寻找
id
属性(最好)或class
名称(好)或属性(可以)。你想获得一个好的“CSS路径”来获得所需的信息。这可以输入到querySelector
或jQuery。请注意,Firebug会给你一个原始的CSS路径,你可以用它作为开始。例如,对于像这样的HTML:
<div id="dress-sizes"> <ul> <li> <span class="dSize" data-color="green">13</span> </li> <li> <span class="dSize" data-color="green">8</span> </li> </ul> </div>
一个很好的选择,找到绿色衣服的尺寸是:
"#dress-sizes ul li span.dSize[data-color='green']"
没有找到一个很好的CSS路径,您可能不得不退出XPath(萤火虫或Chrome会给你)。但是我只有那一次
一旦你找到了一个很好的方法来选择确切的节点(理想的),父节点或可靠的兄弟节点;您将拥有更少(或不)额外的垃圾邮件来过滤RegEx。这减少了错误命中的可能性。
在这种情况下,由于只有唯一十岁上下节点是注销链接<a href="logout.php">
。这看起来很耐用。也就是说,当网站被修改时,改变的可能性不大。但可能有多个注销链接。
所以键控关闭该节点,这是我们可以迄今为止给出的HTML做到最好:
var anchorNode = document.querySelector ("a[href='logout.php']");
var siblingText = anchorNode.parentNode.textContent;
var moves = 0;
var movesMatch = siblingText.match (/Moves:\s*(\d+)(?:\D)/);
if (movesMatch && movesMatch.length > 1) {
moves = parseInt (movesMatch[1], 10);
}
console.log ("The number of moves left is: ", moves);
更新:现在,容器是已知的,并很好有一个id
,使用:
var containerNode = document.querySelector ("#info");
var siblingText = containerNode.textContent;
var moves = 0;
var movesMatch = siblingText.match (/Moves:\s*(\d+)(?:\D)/);
if (movesMatch && movesMatch.length > 1) {
moves = parseInt (movesMatch[1], 10);
}
console.log ("The number of moves left is: ", moves);
Hooray! Tworks很棒。非常感谢。 – BGundlach 2013-02-25 16:18:16
不客气,乐意效劳。 – 2013-02-26 00:01:51