質問

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

私は 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";
            }
           }
          }
役に立ちましたか?

解決

それは Agility パックの罪ではなく、扱いにくい Google の罪です。デバッガで HtmlDocument の _text プロパティを調べると、次のことがわかります。 <ol> それは持っています id='rso' ブラウザで検査すると、何らかの理由で属性がありません。

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

アップデート:さらに検査を行いました。たとえば、これを行うとき:

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> タグなど)。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top