#c# #xpath #web-scraping #html-agility-pack #selectnodes
#c# #xpath #очистка веб-страниц #html-agility-pack #выбранные узлы #selectnodes
Вопрос:
Я пытаюсь использовать пакет гибкого управления HTML для поиска определенных ключевых слов в 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=100amp;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";
}
}
}
Комментарии:
1. Какой тип «неудачи» вы получаете?
2. рейтинг var всегда возвращается как null при поиске по тегу .//*[@id=’rso’], что и возвращает все их результаты поиска, у которых на странице нет нескольких результатов. .//*[@id=’resultStats’] возвращает «Что-то», но точный эквивалент в другом теге ничего не возвращает
3. Кроме того, я могу использовать выражения регулярных выражений для поиска одних и тех же «узлов», поэтому я знаю, что они отображаются как там и должны быть доступны для поиска в направлении Xpath, это просто не возвращает результатов
Ответ №1:
Это не вина пакета Agility pack — это вина хитрого Google. Если вы проверите свойство _text HTMLDocument с помощью debugger, вы обнаружите, что у <ol>
этого свойства id='rso'
при проверке в браузере по какой-то причине нет никаких атрибутов.
Я думаю, в этом случае вы можете просто выполнить поиск по «//ol», потому что на странице результатов Google на данный момент есть только один <ol>
тег…
ОБНОВЛЕНИЕ: я выполнил дополнительные проверки. Например, когда я делаю это:
using (StreamReader sr =
new StreamReader(HttpWebRequest
.Create("http://www.google.com/search?num=100amp;q=test")
.GetResponse()
.GetResponseStream()))
{
string s = sr.ReadToEnd();
var m2 = Regex.Matches(s, "\sid=('[^'] '|"[^"] ")");
foreach (var x in m2)
Console.WriteLine(x);
}
Единственными идентификаторами, которые возвращаются, являются: «sflas», «hidden_modes» и «tbpr_12».
В заключение: я использовал пакет Html Agility Pack, и он довольно хорошо справлялся даже с искаженным html (незакрытыми <p>
и даже <li>
тегами и т.д.).
Комментарии:
1. Спасибо! На самом деле в итоге я обратился к // h3 для получения немного более локализованной информации, но вы указали мне правильный путь.