Передача языкового предпочтения HtmlAgilityPack при получении веб-страниц

Моя цель состоит в том, чтобы считывать определенные контейнеры / теги / атрибуты с веб-сайта (для моего хобби), все работает, кроме получения перевода на немецкий язык для моего значения (которое я обычно получаю, когда вручную открываю сайт в браузере (может быть, в Интернете). сайт получает конкретную информацию от пользовательского агента), но если я использую свою программу, это даст мне только английское значение)

Рабочий код консоли C#:

   List<string> href = new List<string>();
    List<string> titles = new List<string>();

    for (int i = 0; i < 1; i++)
    {
        var webOverview = new HtmlWeb();
        var documentOverview = webOverview.Load("http://gatherer.wizards.com/Pages/Search/Default.aspx?page=0&format=[%22Commander%22]");
            webOverview.UserAgent = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:32.0) Gecko/20100101 Firefox/32.0";//updated
            webOverview.AutoDetectEncoding = true;//updated
        var pageOverview = documentOverview.DocumentNode;

        HtmlNode[] hrefList = pageOverview.QuerySelectorAll("td.leftCol").ToArray();
        HtmlNode[] titleList = pageOverview.QuerySelectorAll("div.cardInfo").ToArray();

        for (int rowcounter = 0; rowcounter < hrefList.Count(); rowcounter++)
        {
            var hrefValue = hrefList[rowcounter].QuerySelector("a").Attributes["href"].Value;
            var titleValue = titleList[rowcounter].QuerySelector("span.cardTitle").InnerText;

            href.Add(hrefValue);
            titles.Add(titleValue);
            Console.WriteLine(rowcounter.ToString() + ". " + hrefValue + ": " + titleValue + "\n\n");
        }

    }
    Console.WriteLine("Links: " + href.Count + " Titles: " + titles.Count + "\n");

В моем браузере я вижу что-то вроде этого "Schlachthaus-Ghul (Abattoir Ghoul)"(без настройки языковых свойств), но если я выполняю свою программу, я получаю "Abattoir Ghoul", который был создан с помощью оператора

HtmlNode[] titleList = pageOverview.QuerySelectorAll("div.cardInfo").ToArray();

но мне нужен этот "Schlachthaus-Ghul (Abattoir Ghoul)", а не только текст на английском языке

Может быть, мне нужно что-то вроде этого пользовательского агента, и я не могу найти прамаметр в URL, который говорит серверу, что я хочу, также немецкий в информации заголовка?

Я обновил две строки (комментарий), и это ничего не изменило (пользовательский агент с http://www.whatsmyuseragent.com/

1 ответ

Решение

Вам нужно сообщить серверу, что вы ожидаете немецкую страницу, отправив ей заголовок "Accept-Language":

var webOverview = new HtmlWeb();
webOverview.PreRequest += (request) =>
{
    request.Headers.Add("Accept-Language", "de-DE");
    return true;
};
var documentOverview = webOverview.Load("http://gatherer.wizards.com/Pages/Search/Default.aspx?page=0&format=[%22Commander%22]");

Что в основном означает:

public void Yourmethod()
{
   var webOverview = new HtmlWeb();
   webOverview.PreRequest += SendGermanLanguageHeaders;

   var documentOverview = webOverview.Load("http://gatherer.wizards.com/Pages/Search/Default.aspx?page=0&format=[%22Commander%22]");
}

private bool SendGermanLanguageHeaders(HttpWebRequest request)
{
   request.Headers.Add("Accept-Language", "de-DE");
   return true;
}

Лямбда-конструкция определяет анонимный метод, короткий, встроенный и в контексте. Затем этот метод добавляется к PreRequest список обработчиков событий с использованием += построить, вы, вероятно, знакомы с. Подробнее об этой конструкции можно узнать здесь.

Другие вопросы по тегам