web-dev-qa-db-ja.com

HTMLをXMLとして読み取る方法は?

インターネットからダウンロードしたhtmlページからいくつかのリンクを抽出したいのですが、私の場合はlinq toXMLを使用するのが良い解決策になると思います。
私の問題は、Load(string url)を使用してHTMLからXmlDocumentを作成できないことです。そのため、次を使用して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に読み取るにはどのようにすればよいですか

11
Ziv

HTMLは単にXMLと同じではありません(HTMLが実際にXMLモードでXHTMLまたはHTML5に準拠している場合を除きます)。最良の方法は HTMLパーサー を使用してHTMLを読み取ることです。その後、それをLinq to XMLに変換するか、直接処理することができます。

14
Konrad Rudolph

私自身は使ったことがありませんが、 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;
}
10
Danko Durbić

前述のように、ページからいくつかのリンクを抽出する場合は、 HTML Agility Pack を使用してみてください。

このコードはWebからページを取得し、すべてのリンクを抽出します。

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);
3
derloopkat

HTMLはXMLではありません。 HTMLはSGMLに基づいているため、マークアップが整形式のXMLであるとは限りません(XMLはSGML自体のサブセットです)。 XHTML、つまりXML互換のHTMLのみをXMLとして解析できます。しかし、もちろんそれはほとんどのウェブサイトには当てはまりません。

HTMLを使用するには、HTMLパーサーを使用する必要があります。

3
poke

興味のあるノードがわかっている場合は、正規表現を使用して文字列からリンクを抽出します。

0
Patrick