1

我正在尝试使用 HTML Agility Pack 在 Google 上查找特定关键字,然后检查链接节点,直到找到我的网站字符串 url,然后解析我所在节点的 innerHTML 以获得我的 Google 排名。

我对 Agility Pack 比较陌生(例如,我昨天开始仔细查看它)所以我希望我能得到一些帮助。当我在下面进行搜索时,每次我的 Xpath 查询都会失败。即使我插入像 SelectNodes("//*[@id='rso']") 这样简单的东西。这是我做错了吗?

    private void GoogleScrape(string url)
    {
        string[] keys = keywordBox.Text.Split(',');
        for (int i = 0; i < keys.Count(); i++)
        {
            var raw = "http://www.google.com/search?num=100&q=";
            string search = raw + HttpUtility.UrlEncode(keys[i]);
            var webGet = new HtmlWeb();
            var document = webGet.Load(search);
            loadtimeBox.Text = webGet.RequestDuration.ToString();

            var ranking = document.DocumentNode.SelectNodes("//*[@id='rso']");

            if (ranking != null)
            {
                googleBox.Text = "Something";
            }
            else
            {
                googleBox.Text = "Fail";
            }
           }
          }
4

1 回答 1

2

这不是敏捷包的内疚——这是棘手的谷歌。如果您使用调试器检查 HtmlDocument 的 _text 属性,您会发现当您在浏览器<ol>id='rso'检查它时由于某种原因没有任何属性。

我认为,在这种情况下,您可以通过“//ol”进行搜索,因为目前<ol>谷歌的结果页面中只有一个标签......

更新:我做了进一步的检查。例如,当我这样做时:

using (StreamReader sr = 
        new StreamReader(HttpWebRequest
          .Create("http://www.google.com/search?num=100&q=test")
          .GetResponse()
          .GetResponseStream()))
{
    string s = sr.ReadToEnd();
    var m2 = Regex.Matches(s, "\\sid=('[^']+'|\"[^\"]+\")");
    foreach (var x in m2)
        Console.WriteLine(x);
}

返回的唯一 ID 是:“sflas”、“hidden_​​modes”和“tbpr_12”。

总结:我使用了 Html Agility Pack,即使使用格式错误的 html(未封闭<p>甚至<li>标签等),它也能很好地应对。

于 2011-06-10T19:56:58.023 回答