2011-08-08 36 views
0

我想提取divs之間的一些數據。HtmlAgility問題

<div class="movie_general"><div class="img"><a href="/Movies.html" title="Watch Movie"> 

富勒例如,如果我想鏈接 「/Movies.html」 我使用:

string hrefValue = doc.DocumentNode 
      .Descendants("div") 
      .Where(x => x.Attributes["class"].Value == "movie_general") 
      .Select(x => x.Element("a").Attributes["href"].Value) 
      .FirstOrDefault(); 

      MessageBox.Show(hrefValue); 

,但我得到在其中(x => x.Attributes [ 「類」]一個NullReferenceException。值==「movie_general」)

我在做什麼錯?

回答

1

發生這種情況是因爲Linq提供程序必須遍歷文檔中的所有其他節點以檢查它是否與您的搜索匹配。此文檔必須至少有一個div,它不具有class屬性。因此,通過嘗試讀取不存在的屬性的Value屬性發生錯誤。

替換此

.Where(x => x.Attributes["class"].Value == "movie_general") 
.Select(x => x.Element("a").Attributes["href"].Value) 

與此

.Where(x => x.Attributes["class"] != null && x.Attributes["class"].Value == "movie_general") 
.Select(x => x.Element("a") != null && x.Element("a").Attributes["href"] != null ? x.Element("a").Attributes["href"].Value : string.Empty) 
+0

現在空例外。 Element(「a」)。Attributes [「href」]。Value)lol – zenpark

+0

我們是否也需要在這裏輸入一個null檢查? – zenpark

+0

是的,你必須。這是同樣的問題。一個div裏沒有'a'節點會觸發另一個NullReferenceException。 – Doug

0

如果你已經知道類的標籤是服從的是,爲什麼不抓住它直接使用:

HtmlDocument doc = new HtmlDocument(); 
    doc.Load("C:\\temp\\stackhtml.html"); 
    string link = doc.DocumentNode.SelectSingleNode("//div[@class='movie_general']//a").GetAttributeValue("href", "unkown"); 
    Console.WriteLine(link); 
    Console.ReadLine(); 

和結果:

enter image description here

我說結束的div標籤到您的例子,這樣我可以刮它,它傾倒在一個文件中我的C盤上:在。選擇(X => X

<div class="movie_general"> 
    <div class="img"> 
     <a href="/Movies.html" title="Watch Movie"> 
    </div> 
</div>