2014-03-03 187 views
2

解析外部html文件時出現對象引用錯誤,我想這是因爲並非所有選中的元素都有類名。這裏是我的代碼:從具有特定類名的元素中選擇值

foreach (HtmlNode link in doc.DocumentNode.Descendants("li").Where(i => i.Attributes["class"].Value == "name")) 
{ 
    string result = link.InnerText.Trim().Replace(" ", ""); 
    Console.WriteLine(result); 
} 

如何只選擇我的班級名稱爲「名稱」的值?

這裏是我的html代碼我試圖解析:

<li> 
    <span class="name"> 
     <a href="/players/joe-bloggs.html">Joe,&nbsp;Bloggs</a> 
    </span> 

    <span class="country"> 
     <img src="/img/flags/15x15/USA.gif" alt="USA"/> 
     United States 
    </span> 
</li> 
<li> 
    <span class="name"> 
     <a href="/players/joe-bloggs.html">Joe,&nbsp;Bloggs</a> 
    </span> 

    <span class="country"> 
     <img src="/img/flags/15x15/USA.gif" alt="USA"/> 
     United States 
    </span> 
</li> 
<li> 
    <span class="name"> 
     <a href="/players/joe-bloggs.html">Joe,&nbsp;Bloggs</a> 
    </span> 

    <span class="country"> 
     <img src="/img/flags/15x15/RSA.gif" alt="RSA"/> 
     South Africa 
    </span> 
</li> 
+0

你能告訴你所得到的錯誤? – BenM

回答

3

你應該選擇a元素,而不是li元素。其span元素其中有class屬性。我建議你使用斷言:

var links = doc.DocumentNode.SelectNodes("//li/span[@class='name']/a"); 

此XPath中選擇具有class屬性等於name所有span元素,然後選擇a元素。

foreach (var a in links) 
    Console.WriteLine(a.InnerText); 

爲您的樣品HTML輸出爲:

Joe,&nbsp;Bloggs 
Joe,&nbsp;Bloggs 
Joe,&nbsp;Bloggs 

邊注 - 您可以使用HttpUtility.HtmlDecode(a.InnerText)得到解碼文本(不僅&nbsp;將被替換)。


UPDATE:解析球員

var players = from p in doc.DocumentNode.SelectNodes("//li") 
       let name = p.SelectSingleNode("span[@class='name']/a") 
       let country = p.SelectSingleNode("span[@class='country']") 
       select new 
       { 
        Name = (name == null) ? null : 
         HttpUtility.HtmlDecode(name.InnerText.Trim()), 
        Country = (country == null) ? null : 
         HttpUtility.HtmlDecode(country.InnerText.Trim()) 
       }; 

結果:

[ 
    { 
    Name: "Joe, Bloggs", 
    Country: "United States" 
    }, 
    { 
    Name: "Joe, Bloggs", 
    Country: "United States" 
    }, 
    { 
    Name: "Joe, Bloggs", 
    Country: "South Africa" 
    } 
] 
+1

完美!這正是我所需要的。 –

+0

很好的答案。你能解釋爲什麼OP的原始方法不起作用嗎?我重新閱讀了幾次,看不出原因。 – BenM

+0

是否可以從上面給出的html中提取名稱和國家?他們都在同一個裏,我只需要文本值。 –

相關問題