Как читать HTML как XML?
Я хочу извлечь пару ссылок из html-страницы, загруженной из Интернета, я думаю, что использование linq для XML было бы хорошим решением для моего дела.
Моя проблема в том, что я не могу создать XmlDocument из HTML, используя Load (string url), не работал, поэтому я загрузил html в строку, используя:
public static string readHTML(string url)
{
HttpWebRequest req = (HttpWebRequest)WebRequest.Create(url);
HttpWebResponse res = (HttpWebResponse)req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
string html = sr.ReadToEnd();
sr.Close();
return html;
}
Когда я пытаюсь загрузить эту строку с помощью LoadXml (string xml), я получаю исключение
'--' is an unexpected token. The expected token is '>'
Какой способ следует использовать для чтения html файла для анализируемого XML
Ответы
Ответ 1
HTML просто не совпадает с XML (если только на самом деле HTML не соответствует XHTML или HTML5 в режиме XML). Лучше всего использовать HTML-парсер для чтения HTML. После этого вы можете преобразовать его в Linq в XML - или обработать его напрямую.
Ответ 2
Я не использовал его сам, но я предлагаю вам взглянуть на SGMLReader. Здесь образец со своей домашней страницы:
XmlDocument FromHtml(TextReader reader) {
// setup SgmlReader
Sgml.SgmlReader sgmlReader = new Sgml.SgmlReader();
sgmlReader.DocType = "HTML";
sgmlReader.WhitespaceHandling = WhitespaceHandling.All;
sgmlReader.CaseFolding = Sgml.CaseFolding.ToLower;
sgmlReader.InputStream = reader;
// create document
XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = true;
doc.XmlResolver = null;
doc.Load(sgmlReader);
return doc;
}
Ответ 3
HTML не XML. HTML основан на SGML и, как таковой, не гарантирует, что разметка является хорошо сформированным XML (XML - это подмножество самого SGML). Вы можете обрабатывать только XHTML, т.е. Совместимый с XML HTML, как XML. Но, конечно, это не относится к большинству веб-сайтов.
Чтобы работать с HTML, вам нужно использовать парсер HTML.
Ответ 4
Если вы хотите извлечь некоторые ссылки со страницы, как вы упомянули, попробуйте использовать HTML Agility Pack.
Этот код получает страницу из Интернета и извлекает все ссылки:
HtmlWeb web = new HtmlWeb();
HtmlDocument document = web.Load("http://www.stackoverflow.com");
HtmlNode[] links = document.DocumentNode.SelectNodes("//a").ToArray();
Откройте html файл с диска и получите URL-адрес для конкретной ссылки:
HtmlDocument document2 = new HtmlDocument();
document2.Load(@"C:\Temp\page.html")
HtmlNode link = document2.DocumentNode.SelectSingleNode("//a[@id='myLink']");
Console.WriteLine(link.Attributes["href"].Value);
Ответ 5
Если вы знаете интересующие вас узлы, я бы использовал regex для извлечения ссылок из строки.