Html敏捷性问题

时间:2011-08-08 01:09:06

标签: html html-agility-pack

我想在div之间提取一些数据。

<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);

但是我在Where(x =&gt; x.Attributes [“class”]得到一个NullReferenceException。值==“movie_general”)

我做错了什么?

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

如果你已经知道了这个类并且a标签从属于那个,为什么不直接使用它来抓住它:

 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标签,以便我可以将其抓取并将其转储到我的驱动器上的文件中:

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