Как получить HTML-код страницы, открытой в веб-браузере в правильной кодировке? - PullRequest
0 голосов
/ 08 января 2019

Я пытаюсь получить Html-код страницы, открытой в "webBrowser".

public string GetHTMLCodPage()
{
    string htmlCodPage;
    htmlCodPage = webBrowser1.DocumentText;

    return htmlCodPage;
}

Я получаю код (показывает фрагмент кода)

  <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" dir="ltr" lang="ru">
<head>
    <title>���������, ����������� �����, ����������� �����, ����������� ������ - C# - ����������</title>
    <link rel="canonical" href="http://www.cyberforum.ru/csharp-beginners/thread2385183.html" />

    <base href="http://www.cyberforum.ru/" />
<meta http-equiv="Content-Type" content="text/html; charset=windows-1251" />

<meta name="keywords" content="C#, ���������, ����������� �����, ����������� �����, ����������� ������" />
<meta name="description" content="������: ���������, ����������� �����, ����������� �����, ����������� ������ C# �����" />

Вопрос
Как получить HTML-код страницы, открытой в веб-браузере в правильной кодировке?

1 Ответ

0 голосов
/ 08 января 2019

(назовем это так) стандартным способом является чтение WebBrowser.DocumentStream вместо транскодированного DocumentText .

Затем используйте внутреннюю кодировку (страница Content-Type charset), предоставленную свойством WebBrowser.Document.Encoding , и используйте эту кодировку для чтения потока.

Используйте этот код, когда WebBrowser.Document загружен полностью, подписавшись на событие WebBrowser.DocumentCompleted и ожидая, пока WebBrowser1.ReadyState = WebBrowserReadyState.Complete .

В примере кода закодированный текст отправляется в элемент управления TextBox.
Это просто пример. Делай что хочешь с этим. Но имейте в виду, что событие DocumentCompleted может быть вызвано несколько раз.

//Somewhere...
webBrowser1.Navigate("http://www.cyberforum.ru/");


private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    if (webBrowser1.ReadyState != WebBrowserReadyState.Complete) return;

    string decodedText = string.Empty;
    Stream htmlStream = webBrowser1.DocumentStream;
    Encoding pageEncoding = Encoding.GetEncoding(webBrowser1.Document.Encoding);

    using (StreamReader destReader = new StreamReader(htmlStream, pageEncoding))
    {
        decodedText = destReader.ReadToEnd();
    };
    textBox1.Text = decodedText;
}

Теперь текст содержимого страницы использует правильную кодировку:

<meta name="keywords" content="форум программистов, компьютерный форум, киберфорум,(...)" />
<meta name="description" content="КиберФорум - форум программистов (...)" />
...