1

HTML Agility Packを使用してGoogleで特定のキーワードを検索し、リンクされたノードをチェックしてWebサイトの文字列URLが見つかるまで確認し、現在のノードのinnerHTMLを解析してGoogleのランキングを取得しようとしています。

私は敏捷性パックに比較的慣れていないので(昨日から実際に調べ始めました)、助けが得られることを望んでいました。以下の検索を実行すると、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

それは Agility パックの罪悪感ではなく、トリッキーな Google の罪悪感です。デバッガーで HtmlDocument の _text プロパティを調べると、ブラウザーで調べると、何らかの理由で属性がないこと<ol>がわかります。id='rso'

この場合、「//ol」で検索できると思います<ol>。現時点では、Google の結果ページにタグが 1 つしかないためです...

更新:さらにチェックを行いました。たとえば、これを行うと:

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 に答える