我想在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”)
我做错了什么?
答案 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();
结果:
我在示例中添加了关闭div标签,以便我可以将其抓取并将其转储到我的驱动器上的文件中:
<div class="movie_general">
<div class="img">
<a href="/Movies.html" title="Watch Movie">
</div>
</div>