2017-11-17 12 views
2

WebサイトでHtml Agility Packを使用してデータを抽出しています。私が必要とするHTMLの一部を解析するのは簡単ですが、私はこの(ちょっと複雑な)HTMLの部分に問題があります。divの要素をhtml agility packで解析する[C#]

<tr> 
    <td> 
    <div onmouseover="toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br /><br /><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')" onmouseout="toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')" onclick="togglestick('clue_J_1_1_stuck')"> 
... 

私はclue_J_X_Y値に基づいてのonmouseover divの中にEMクラス「correct_response」から値を取得する必要があります。私は本当にこれを越える方法を知りません。

HtmlNodeCollection nodes = doc.DocumentNode.SelectNodes("//tr//td/div[@onmouseover]"); 

いくつかの助けになると思います。

答えて

1

私はあなたがemから出なければならないものは分かりません。しかし、私はあなたにあなたがそれを理解する必要があると言うすべてのデータを提供します。

まず、HTMLを読み込みます。

string html = "<tr>" + 
     "<td>" + 
     "<div onmouseover = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br/><br/><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')\" onmouseout = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')\" onclick = \"togglestick('clue_J_1_1_stuck')\"></div></td></tr>"; 
    HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
    doc.LoadHtml(html); 
    //Console.WriteLine(doc.DocumentNode.OuterHtml); 

次に、onmouseoverという属性の値を取得します。

 string toggle = doc.DocumentNode.SelectSingleNode("//tr//td/div[@onmouseover]").GetAttributeValue("onmouseover", "FAILED"); 

"onmouseover"という名前の属性を見つけられなかった場合、FAILEDを返します。ここでは、トグルメソッドのパラメータをそれぞれ2つの '(アポストロフィ)で囲んでいます。

//Get Variables from toggle() 
List<string> toggleVariables = new List<string>(); 
bool flag = false; string temp = ""; 
for(int i=0; i<toggle.Length; i++) 
{ 
    if (toggle[i] == '\'' && flag== true) 
    { 
     toggleVariables.Add(temp); 
     temp = ""; 
     flag = false; 
    } 
    else if (flag) 
    { 
     temp += toggle[i]; 
    } 
    else if (toggle[i] == '\'') 
    { 
     flag = true; 
    } 
} 

その後、3つのエンティティのリストがあります。この場合、次の情報が含まれます。

  • clue_J_1_1
  • clue_J_1_1_stuck
  • < EMクラス= " correct_response " >オバマ</EM > < BR/> < BR/> <テーブル幅= " 100%" > <TR> < TDクラス= " right " >カイルン</td > </tr > < /表>;

ここで、3番目のパラメータのHTMLコードで新しいHtmlDocumentを作成できます。しかし、まず3つ目のパラメータにHTMLからのエスケープ文字が含まれているため、これを実行可能なHTMLに変換する必要があります。

 //Make it into workable HTML 
     toggleVariables[2] = HttpUtility.HtmlDecode(toggleVariables[2]); 

     //New HtmlDocument 
     HtmlDocument htmlInsideToggle = new HtmlDocument(); 
     htmlInsideToggle.LoadHtml(toggleVariables[2]); 

     Console.WriteLine(htmlInsideToggle.DocumentNode.OuterHtml); 

そして完了です。全体のコードはここから下にあります。

using System; 
using System.Collections.Generic; 
using System.IO; 
using System.Net; 
using HtmlAgilityPack; 
using System.Web; 

namespace test 
{ 
    class Program 
    { 

    public static void Main(string[] args) 
    { 
      string html = "<tr>" + 
       "<td>" + 
       "<div onmouseover = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', '<em class=&quot;correct_response&quot;>Obama</em><br/><br/><table width=&quot;100%&quot;><tr><td class=&quot;right&quot;>Kailyn</td></tr></table>')\" onmouseout = \"toggle('clue_J_1_1', 'clue_J_1_1_stuck', 'Michelle LaVaughn Robinson')\" onclick = \"togglestick('clue_J_1_1_stuck')\"></div></td></tr>"; 
      HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); 
      doc.LoadHtml(html); 
      //Console.WriteLine(doc.DocumentNode.OuterHtml); 

      string toggle = doc.DocumentNode.SelectSingleNode("//tr//td/div[@onmouseover]").GetAttributeValue("onmouseover", "FAILED"); 
      //Clean up string 

      //Console.WriteLine(toggle); 

      //Get Variables from toggle() 
      List<string> toggleVariables = new List<string>(); 
      bool flag = false; string temp = ""; 
      for(int i=0; i<toggle.Length; i++) 
      { 
       if (toggle[i] == '\'' && flag== true) 
       { 
        toggleVariables.Add(temp); 
        temp = ""; 
        flag = false; 
       } 
       else if (flag) 
       { 
        temp += toggle[i]; 
       } 
       else if (toggle[i] == '\'') 
       { 
        flag = true; 
       } 
      } 

      //Make it into workable HTML 
      toggleVariables[2] = HttpUtility.HtmlDecode(toggleVariables[2]); 
      //New HtmlDocument 
      HtmlDocument htmlInsideToggle = new HtmlDocument(); 
      htmlInsideToggle.LoadHtml(toggleVariables[2]); 

      Console.WriteLine(htmlInsideToggle.DocumentNode.OuterHtml); 

      //You're on your own from here     

      Console.ReadKey(); 

    } 
} 
関連する問題