我正在尝试使用HTML Agility Pack在Google上查找特定关键字,然后检查链接节点,直到找到我的网站字符串网址,然后解析我所使用的节点的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";
}
}
}
答案 0 :(得分:2)
这不是敏捷包的内疚 - 这是棘手的谷歌。如果您使用调试器检查HtmlDocument的_text属性,当您在浏览器中检查时<ol>
id='rso'
,由于某种原因,它没有任何属性。
我认为,在这种情况下,您可以按“// ol”搜索,因为目前google的结果页中只有一个<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>
标签等,它也能很好地应对。)