HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument(); doc.LoadHtml(content); var nodes = doc.DocumentNode.SelectNodes("//div[@class=\"noprint res\"]/div"); if (nodes != null) { foreach (HtmlNode data in nodes) { // Works but not what I want MessageBox.Show(data.InnerHtml); // Should work ? but does not ? MessageBox.Show(data.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText); } }
Я пытаюсь проанализировать результаты HTML, начальный узел foreach работает так, как и ожидалось, и дает мне результат из 10 элементов, который соответствует тому, что мне нужно.
Когда я попадаю в foreach, если я вывожу внутренний html элемента данных, он отображает правильные данные, но если я вывожу SelectSingleNode, он всегда будет отображать данные из первого элемента из foreach, это то, что нормальное поведение или я что-то не так делаю?
Чтобы решить эту проблему, мне пришлось создать новый html внутри foreach для каждого элемента данных следующим образом:
HtmlAgilityPack.HtmlDocument innerDoc = new HtmlAgilityPack.HtmlDocument(); innerDoc.LoadHtml(data.InnerHtml); // Select what I need MessageBox.Show(innerDoc.DocumentNode.SelectSingleNode("//span[@class=\"pp-place-title\"]").InnerText);
Затем я получаю правильные данные для каждого элемента.
Страница, с которой я пытался получить данные, была http://maps.google.com/maps?q=consulting+loc:+US, если вы хотите попробовать и сами посмотреть, что получится. .
В основном я читаю названия компаний в левой колонке, и происходит вышеописанное.