2014-10-29 54 views
0

我刚才问过这个问题,但我想重新说明这个问题。我正在努力为我的项目制作一个刮板。我想让它显示链接的某个部分。链接唯一改变的部分是数字。这个数字是我想要刮的。链接如下所示:awesomium web刮某些部分

<a href="/link/player.jsp?user=966354" target="_parent" "=""> 

如上所述,我试图仅报废链接的966354部分。我尝试了几种方法来做到这一点,但无法弄清楚。当我添加

<a href="/link/player.jsp?user="   

到下面的代码它打破

List<string> player = new List<string>(); 
string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('a')[0].innerHTML"); 
MatchCollection m1 = Regex.Matches(html, "<a href=\\s*(.+?)\\s*</a>", RegexOptions.Singleline); 
foreach (Match m in m1) 
{ 
    string players = m.Groups[1].Value; 
    player.Add(players); 
} 
    listBox.DataSource = player; 

所以我删除它,就说明没有错误,直到我去运行程序,然后我得到这个错误:

“在Awesomium.Windows.Forms.dll中发生类型'System.InvalidOperationException'的未处理的异常“

所以我试了这个,它有些什么工作:

string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML");  

这段代码碎片,但不是我想要的样子,请有人伸出援助之手。

回答

1

我会使用HtmlAgilityPack(通过NuGet安装它)和XPath查询来解析HTML。

事情是这样的:

string html = webControl2.ExecuteJavascriptWithResult("document.getElementsByTagName('html')[0].innerHTML"); 
var htmlDoc = new HtmlAgilityPack.HtmlDocument(); 
htmlDoc.LoadHtml(html); 

var playerIds = new List<string>(); 

var playerNodes = htmlDoc.DocumentNode.SelectNodes("//a[contains(@href, '/link/profile-view.jsp?user=')]"); 

if (playerNodes != null) 
{ 
    foreach (var playerNode in playerNodes) 
    { 
     string href = playerNode.Attributes["href"].Value; 

     var parts = href.Split(new char[] { '=' }, StringSplitOptions.RemoveEmptyEntries); 
     if (parts.Length > 1) 
     { 
      playerIds.Add(parts[1]); 
     } 
    } 

    id.DataSource = playerIds; 
} 

而且你会发现这两个简单的辅助类有用:https://gist.github.com/AlexP11223/8286153

第一个是extension methods对的WebView/WebControl的,第二个有一些静态方法来生成用于通过XPath +获取JSObject的坐标来获取元素(JSObject)的JS代码)

+0

谢谢,帮助了很多 – David 2014-10-30 21:58:27

+0

编辑,它只是坠毁与一个error:NullReferenceException未处理指向foreach – David 2014-10-30 22:06:58

+0

如果没有合适的元素,playerNodes将为null因此,如果您有时在没有这些元素的页面上执行它,您可能需要检查它 – AlexP11223 2014-10-30 22:13:39

0

使用下面的示例html文件,我无法复制异常。

<html> 
<a href="/link/player.jsp?user=966354" target="_parent" "="">test</a> 
</html> 

然而,JavaScript的

document.getElementsByTagName('a')[0].innerHTML 

会在我的例子返回 “测试”。你可能想要的是

document.getElementsByTagName('a')[0].href 

这将返回href部分。

'innerHTML'属性将返回开始标记和结束标记之间的所有内容(如< html> </html>)。这可能是你获得'html'元素后获得更好成功的原因 - 你最终会解析整个链接。如果您想使用浏览器来测试javascript输出,则可以使用此功能。

+0

我已经试过了那个。它拉动了链接,但错误的链接也拉动了我不想要的整个链接。我唯一想刮的部分是数字“966354”而不是整个链接。但是谢谢你的回复。 – David 2014-10-29 18:20:35

+0

那么,你需要以某种方式识别页面中其他链接的链接(理想情况下用ID,但在你的例子中似乎并不存在,所以可能通过'target ='_ parent''属性 获得正确的链接后,解析链接'用户='部分后的位是一个简单的问题 – Pickett 2014-10-29 23:42:58