如何使用HTML Agility Pack从特定类中提取文本?

时间:2016-05-23 23:47:23

标签: c# html-agility-pack

例如,我想从http://www.urbandictionary.com/define.php?term=potato中提取第一个定义。不过,它是原始文本。

                    var html = new HtmlDocument();
                html.LoadHtml(new WebClient().DownloadString("http://www.urbandictionary.com/define.php?term=potato"));
                var root = html.DocumentNode;
                var p = root.Descendants()
                    .Where(n => n.GetAttributeValue("class", "").Equals("meaning"))
                    .Single()
                    .Descendants("")
                    .Single();
                var content = p.InnerText;

这是我用来尝试提取含义类的代码。这根本不起作用,但是......如何从Urban Dictionary中提取课程?

2 个答案:

答案 0 :(得分:0)

如果您更改以下代码,则可以使用

var html = new HtmlDocument();
html.LoadHtml(new WebClient().DownloadString("http://www.urbandictionary.com/define.php?term=potato"));
var root = html.DocumentNode;
var p = root.SelectNodes("//div[@class='meaning']").First();
var content = p.InnerText;

我在SelectNodes中使用的文字是XPath,表示所有div个元素,其中的类名为meaning。您需要使用FirstFirstOrDefault,因为该网页包含多个具有该类名称的div元素,因此Single会引发异常。

答案 1 :(得分:0)

或者你可以使用,如果你想使用相同的"风格"作为你正在使用的链接。

var p = root.Descendants()
    .Where(n => n.GetAttributeValue("class", "").Equals("meaning"))
    .FirstOrDefault();

虽然Tone的答案更优雅,但一个衬垫通常更好。