Подтвердить что ты не робот

String to HtmlDocument

Я извлекаю html-документ по URL-адресу с помощью WebClient.DownloadString(url), но затем очень сложно найти содержимое элемента, которое я ищу. Пока я читал, я заметил HtmlDocument и у него были такие аккуратные вещи, как GetElementById. Как я могу заполнить HtmlDocument с помощью html, возвращаемого url?

4b9b3361

Ответ 1

Класс HtmlDocument представляет собой оболочку вокруг собственного интерфейса интерфейса IHtmlDocument2.
Вы не можете легко создать его из строки.

Вы должны использовать HTML Agility Pack.

Ответ 2

Используя Html Agility Pack как было предложено SLaks, это становится очень простым:

string html = webClient.DownloadString(url);
var doc = new HtmlDocument();
doc.LoadHtml(html);

HtmlNode specificNode = doc.GetElementById("nodeId");
HtmlNodeCollection nodesMatchingXPath = doc.DocumentNode.SelectNodes("x/path/nodes");

Ответ 3

Чтобы ответить на исходный вопрос:

HTMLDocument doc = new HTMLDocument();
IHTMLDocument2 doc2 = (IHTMLDocument2)doc;
doc2.write(fileText);
// now use doc

Затем для преобразования обратно в строку:

doc.documentElement.outerHTML;

Ответ 4

Для тех, кто не хочет использовать пакет гибкости HTML и хочет получить HtmlDocument из строки, используя собственный .net-код, только вот хорошая статья о how для преобразования строки в HtmlDocument

Вот код для использования

public System.Windows.Forms.HtmlDocument GetHtmlDocument(string html)
        {
            WebBrowser browser = new WebBrowser();
            browser.ScriptErrorsSuppressed = true;
            browser.DocumentText = html;
            browser.Document.OpenNew(true);
            browser.Document.Write(html);
            browser.Refresh();
            return browser.Document;
        }

Ответ 5

вы можете получить htmldocument:

 System.Net.WebClient wc = new System.Net.WebClient();

 System.IO.Stream stream = wc.OpenRead(url);
 System.IO.StreamReader reader = new System.IO.StreamReader(stream);
 string s = reader.ReadToEnd();

 HtmlDocument doc = new HtmlDocument();
 doc.LoadHtml(s);

так что у вас есть getbiyid и getbyname... но в дальнейшем вам лучше с помощью HTML Agility Pack, как было предложено. f.e вы можете сделать: doc.DocumentNode.SelectNodes(xpathselector)  или регулярное выражение для анализа документа.

btw: почему не регулярное выражение?, его soo круто, если вы можете использовать его правильно... но xpath тоже очень могучий... так что "выберите свой яд"

у.е.

Ответ 7

Как насчет:

var temp = Path.GetTempFileName();
var tempFile = temp.Replace(Path.GetExtension(temp),".html");
using (System.IO.StreamWriter sw = new System.IO.StreamWriter(tempFile))
{
      sw.Write(YourHTMLString);
}
Process.Start(new ProcessStartInfo(tempFile));