2012-04-28 32 views
1

我其實想虎視眈眈從具有某些子標籤如何讓只從HTML父標籤文本在C#

例如標籤文字:

<p><span>Child Text </span><span class="price">Child Text</span><br /> 
I need this text</p> 

這是什麼我試圖

HtmlElement menuElement = browser.Document.GetElementsByTagName("p"); 
String mytext = menuElement.InnerHtml; //also tried innerText,OuterHtml,OuterText 

更新:我覺得我必須使用Htmlagilitypack,所以現在我的問題是如何做到THI使用htmlagilitypack lib,我是新手。

感謝

+0

因爲您需要在c#中找到,請從問題 – 2012-04-28 19:34:41

+0

中刪除javascript標籤@CharandeepSingh - 您可以對標籤進行建議編輯,您知道嗎? – Oded 2012-04-28 19:35:07

+0

基本上你需要直接的子節點,它是一個文本節點。不確定這可以通過'HtmlElement'實現。 HTML敏捷包在這方面可能更加靈活。 – Oded 2012-04-28 19:36:33

回答

2

使用正則表達式到web scrapping庫有很多方法可以解決這個問題。我建議你使用htmlagilitypack,你可以通過xpath來準確解決你需要的東西。 爲HtmlAgilityPack添加引用和命名空間,我使用linq(這需要.net 3.5或更高版本),下面的代碼可以做到這一點。

using HtmlAgilityPack; 
using System.Linq; 

//這些參考文件必須可用。

 private void Form1_Load(object sender, EventArgs e) 
     { 
      var rawData = "<p><span>Child Text </span><span class=\"price\">Child Text</span><br />I need this text</p>"; 
      var html = new HtmlAgilityPack.HtmlDocument(); 
      html.LoadHtml(rawData); 
      html.DocumentNode.SelectNodes("//p/text()").ToList().ForEach(x=>MessageBox.Show(x.InnerHtml)); 
     } 
0

它的多,如果你可以把「需要這個文本」的跨度內帶有ID很容易 - 那麼你只要抓住該ID的.innerHTML()。如果您無法更改標記,則可以在「
」之後獲取menuElement的.innerHTML()和字符串匹配內容,但這非常脆弱。

+0

感謝robrich,但我不能更改html代碼,進一步我有很多標籤,我想通過循環抓住,所以匹配字符串不是選擇4我。 – 2012-04-28 19:37:58

0

您可以通過將DocumentText拆分爲不同的部分來獲取文本。

string text = "<p><span>Child Text </span><span class="price">Child Text</span><br />I need this text</p>"; 
text = text.Split(new string{"<p><span>Child Text </span><span class="price">Child Text</span><br />"}, StringSplitOptions.None)[1]; 
// Splits the first part of the text, leaving us with "I need this text</p>" 
// We can remove the last </p> many ways, but here I will show you one way. 
text = text.Split(new string{"</p>"}, StringSplitOptions.None)[0]; 
// text now has the value of "I need this text" 

希望對您有所幫助!