【问题标题】:How do I parse images from google and display them into a pictureBox?如何解析来自谷歌的图像并将它们显示到图片框中?
【发布时间】:2021-07-07 22:43:08
【问题描述】:

我正在尝试在 Windows 窗体中进行 Google 图片搜索,但我的代码返回 null,即使我手动搜索 xPath 也会将我带到图片。我对 API 和 NuGet 包还很陌生,所以对我来说轻松点,哈哈!错误具体是“对象引用未设置为对象的实例。但是当我搜索 xPath 时,它会显示 48 个结果。这是我的代码

private void searchButton_Click(object sender, EventArgs e)
    {
        string ImageQuery = titleTextBox.Text;
        var htmlDocument = new HtmlWeb().Load("https://www.google.com/search?q=+" + ImageQuery + "&tbm=isch");
        var imageNode = htmlDocument.DocumentNode.SelectSingleNode("//div[@class='bRMDJf islir']/img");
        string imagePath = imageNode.Attributes["src"].Value;

        var imageStream = HttpWebRequest.Create(imagePath).GetResponse().GetResponseStream();
        this.optionOnePicture.Image = Image.FromStream(imageStream);
    }

【问题讨论】:

  • 刚刚检查了谷歌,从我可以看到的 src 包含 base64 格式的图像本身。您需要做的就是将其转换为图像
  • 你所做的不是查询 API;您正在抓取 HTML 内容,不管这是否合法,这会让您非常头疼,因为 1)他们可能很难做到,2)任何时候他们改变前端呈现您的功能的方式都会中断。
  • 应该是2个问题:1.如何从google获取图片2.将图片显示到pictureBox中?
  • @TheBluePrint,有更新吗?请检查我的答案是否适合您。

标签: c# .net visual-studio


【解决方案1】:

您可以尝试使用以下代码从 google 获取图像并将其显示在图片框中。

 private void button1_Click(object sender, EventArgs e)
        {
            string ImageQuery = textBox1.Text;
            var htmlDocument = new HtmlWeb().Load("https://www.google.com/search?q=+" + ImageQuery + "&tbm=isch");
            var list=GetImagesInHTMLString(htmlDocument.Text);
            var str = list[0];
            string pattern = @"(https://.*);";
            Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
            Match matches = rgx.Match(str);
            string path = matches.Groups[1].Value;
            var imageStream = HttpWebRequest.Create(path).GetResponse().GetResponseStream();
            this.pictureBox1.Image = Image.FromStream(imageStream);
        }

        private List<string> GetImagesInHTMLString(string htmlString)
        {
            List<string> images = new List<string>();
            string pattern = @"<(img)\b[^>]*>";
            Regex rgx = new Regex(pattern, RegexOptions.IgnoreCase);
            MatchCollection matches = rgx.Matches(htmlString);

            for (int i = 0, l = matches.Count; i < l; i++)
            {
                images.Add(matches[i].Value);
            }
            return images;
        }

为了测试,我选择了搜索后的第一张图片。

结果:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-11
    • 1970-01-01
    • 2016-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多