【问题标题】:DocumentNode.SelectNodes returns null - HtmlAgilityPackDocumentNode.SelectNodes 返回 null - HtmlAgilityPack
【发布时间】:2017-05-20 09:48:04
【问题描述】:

我想获取存储在 Html 源代码的 span 标签中的不同电影的 IMDB 评分。为此,我正在尝试使用 Html 解析从 HTML 跨度标签中收集数据。在调用返回 null 的 DocumentNode 的 SelectNodes() 方法之前,一切正常。

我知道这个问题之前已经被问过很多次了,但是尽管进行了大量研究并尝试了不同的解决方案,但我似乎无法弄清楚我的代码有什么问题。为了完成我的学期项目,解决这个问题对我来说真的很重要,所以任何形式的帮助都将不胜感激。 谢谢。

string url = "https://www.google.com/search?client=opera&q=into+the+wild&sourceid=opera&ie=UTF-8&oe=UTF-8";

        StreamReader sourceCode = makeHttpRequest(url);
        //makeRequest() returns the html source code of the url
        String sourceCodeString = sourceCode.ReadToEnd();

        HtmlDocument doc = new HtmlDocument();
        doc.LoadHtml(sourceCodeString);
        var itemList = doc.DocumentNode.SelectNodes("//span[@class='_tvg']")
                .Select(p => p.InnerText)
                .ToList();

【问题讨论】:

    标签: c# html html-parsing html-agility-pack


    【解决方案1】:

    这里的重点是设置用户代理。

    下面的代码返回3个结果,如果你去掉User-Agent你会得到一个空值...

    using (var client = new HttpClient())
    {
        client.DefaultRequestHeaders.TryAddWithoutValidation("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36");
        var html = await client.GetStringAsync("https://www.google.com/search?client=opera&q=into+the+wild&sourceid=opera&ie=UTF-8&oe=UTF-8");
        var doc = new HtmlAgilityPack.HtmlDocument();
        doc.LoadHtml(html);
        var result = doc.DocumentNode
                        .SelectNodes("//span[@class='_tvg']")
                        .Select(p => p.InnerText)
                        .ToList();
    
    
    }
    

    【讨论】:

    • 我已经使用了上面的代码,但是在声明 var html = await client.GetStringAsync(" ");程序终止(不抛出任何异常)并且剩余的语句不被执行。你能解释一下这个原因吗?
    • @KhursandShakeel 只需创建一个空的 winforms 项目将此代码粘贴到 Form_Load 并重试(不要忘记将方法标记为异步)顺便说一句:您可能想要使用一个 try/catch 块...
    • 我用 async 标记了该方法,并且还放置了一个 try/catch 块,但仍然没有成功。顺便说一句,我正在使用控制台应用程序而不是 Windows 窗体应用程序,因为我从未使用过 winforms 应用程序。不能在控制台应用程序上完成吗?
    • @KhursandShakeel 控制台应用没有同步上下文,所以不要使用await,而是使用var html = client.GetStringAsync(...).Result。
    • @L.B 它完全奏效了!说真的,我非常感谢你帮助我:)
    猜你喜欢
    • 1970-01-01
    • 2018-03-04
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 2013-08-05
    • 1970-01-01
    • 1970-01-01
    • 2018-05-17
    相关资源
    最近更新 更多