2014-03-03 138 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中提取名称和国家?他们都在同一个里,我只需要文本值。 –

相关问题