Agility Pack XPath の問題
-
26-10-2019 - |
質問
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>
タグなど)。
所属していません StackOverflow