【问题标题】:Screen scrape text with Html Agility Pack from Google Search Featured Snippets Url result使用 Google 搜索精选片段网址结果中的 Html 敏捷包屏幕抓取文本
【发布时间】:2020-11-27 19:23:32
【问题描述】:

我试图弄清楚,如果不使用Google Search API,从Google SearchFeatured Snippets免费获取个人非商业桌面应用程序的结果是否合法且有可能解析此类结果:

string inputUrl = "http://google.com/search?q=" + "who is Elvis Presley";

或:

 string inputUrl = "http://google.com/search?search?client=firefox-b-d&q=who+is+elvis+presley";

我正在尝试在C# WinForms 桌面应用程序中使用HtmlAgilityPac

string inputUrl = "http://somesite.net/";

假设在列表中添加结果:

 List<string> outputList = new List<string>();

我可以屏蔽抓取链接ExtractHref(inputUrl);,但我试图弄清楚如何从 url 中只获取文本单词和句子:

    private void ExtractHref(string URL)
    {
        lst.Clear();
        HtmlWeb web = new HtmlWeb();
        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();
        doc = web.Load(URL);

        foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//a[@href]"))
        {
            HtmlAttribute att = link.Attributes["href"];

            if (att.Value.Contains("a"))
            {                   
                outputList .Add(att.Value);                   
            }
        }

        textBox1.Text = String.Join(Environment.NewLine, outputList); 
    }
   

我的目标是获得 Google 搜索浏览器结果:https://www.google.com/search?search?client=firefox-b-d&q=who+is+elvis+presley 显示精选片段搜索:

Elvis Presley,完整版 Elvis Aaron Presley 或 Elvis Aron Presley(参见 研究员笔记),(1935 年 1 月 8 日出生于密西西比州图珀洛, 美国——1977 年 8 月 16 日逝世于田纳西州孟菲斯),美国流行 被誉为“摇滚之王”和摇滚乐之一的歌手 从 1950 年代中期到 ..

以及来自维基百科的主题:

猫王亚伦普雷斯利,也简称为猫王,是美国人 歌手、音乐家和演员。他被认为是最 20 世纪的重要文化偶像,经常被提及 成为“摇滚之王”或简称为“国王”。

【问题讨论】:

    标签: c# screen-scraping html-agility-pack google-rich-snippets


    【解决方案1】:

    您只需更新 for 循环即可读取 href 值,因为 XPath 已经过滤了 &lt;a&gt; 元素,无需进一步检查。

        HtmlNode[] nodes = doc.DocumentNode
                .SelectNodes("//a[@href]")
                .ToArray();
            foreach (HtmlNode item in nodes)
            {
                Console.WriteLine(item.InnerHtml);
            }
            List<string> outputList = new List<string>();
    
            foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//div[@class='rc']"))
            {
                outputList.Add(link.InnerText);
            }
    

    【讨论】:

    • 您好,我已经编辑了我的问题以澄清,link.InnerHtml 仅返回链接文本
    • 更新的代码我认为这会给你 url 中的单词列表,如果你发现单词之间有任何特殊字符,你可以添加 splitChars
    • 看来我需要一些不同的方法来完成这项任务,您的代码在 outputList 中拆分了请求的 url 字符串,但我正在尝试获取上次编辑中描述的搜索结果,请检查
    • 请注意,这有助于检查源代码并发现所有结果都包含在 rc 类周围,但是除了现在此代码读取文本而不是 innerhtml 之外,搜索引擎可以随时更改这一点。
    • foreach (HtmlNode link in doc.DocumentNode.SelectNodes("//div[@class='rc']")) throws System.NullReferenceException: 'Object reference not set to an instance of an object.'foreach (HtmlNode item in nodes) 结果是 test2
    猜你喜欢
    • 2017-11-21
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 2014-03-20
    相关资源
    最近更新 更多