2014-10-29 87 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