2014-01-19 167 views
1

我想從html獲取特定數據。即時通訊使用C#和HtmlAgilityPack從html獲取特定數據

這裏是HTML樣本:

StringBuilder pureText = new StringBuilder(); 
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(Lyrics); 

var s = doc.DocumentNode.Descendants("p"); 

try 
{ 
    foreach (HtmlNode childNode in s) 
    { 
         pureText.Append(childNode.InnerText); 
    } 
} 
catch 
{ } 

UPDATE:

StringBuilder pureText = new StringBuilder(); 
HtmlDocument doc = new HtmlDocument(); 
doc.LoadHtml(URL); 

var s = doc.DocumentNode.SelectNodes("//p[@class='verse']"); // error 

try 
{ 
    foreach (HtmlNode childNode in s) 
    { 
      pureText.Append(childNode.InnerText); 
    } 
} 
catch 
{ } 

錯誤:

'

<p class="heading"><span>Greeting!</span> 

<p class='verse'>Hi!<br>    // 
Hello!</p><p class='verse'>Hello!<br> // i want to get this g 
Hi!</p>        // 

<p class="writers"><strong>WE</strong><br/> 

這裏我在C#代碼HtmlAgili tyPack.HtmlNode'不包含'SelectNodes'的定義,並且沒有找到接受'HtmlAgilityPack.HtmlNode'類型的第一個參數的擴展方法'SelectNodes'(可以找到缺少使用指令或程序集引用嗎?)

回答

4

您可以使用XPath查詢語法儘量選擇具有class='verse',這樣所有<p>

var s = doc.DocumentNode.SelectNodes("//p[@class='verse']"); 

然後做同樣的foreach因爲你已經離開。

更新我:

我不知道爲什麼上面扔錯誤你的代碼。它已經在我的電腦上測試過了,應該可以正常工作。無論如何,如果你接受的解決方法,可以在不XPath的實現相同的查詢是這樣的:

var s = doc.DocumentNode.Descendants("p").Where(o => o.Attributes["class"] != null && o.Attributes["class"].Value == "verse"); 

該方案較長時間,因爲我們需要檢查節點是否有類attibutes與否,檢查屬性前值。否則,如果有沒有類屬性的<p>,我們將得到Null Reference Exception

+2

有錯誤'HtmlAgilityPack.HtmlNode'不包含'SelectNodes'的定義,並且沒有找到接受類型'HtmlAgilityPack.HtmlNode'類型的第一個參數的擴展方法'SelectNodes'(您是否缺少using指令或一個程序集引用?) – user3190447

+0

'SelectNodes'的參數應該是一個字符串,就像我在答案中看到的那樣,而不是'HtmlNode'。你如何應用這個解決方案?嘗試發佈你的代碼,如果你不知道如何修復它,會觸發錯誤 – har07

+0

StringBuilder pureText = new StringBuilder(); HtmlDocument doc = new HtmlDocument(); doc.LoadHtml(URL); var s = doc.DocumentNode.SelectNodes(「// p [@ class ='verse']」); // error try foreach(HtmlNode childNode in s) { pureText.Append(childNode.InnerText); } } catch {} – user3190447