Как читать 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 для извлечения ссылок из строки.