检索网页时将语言首选项传递给HtmlAgilityPack

时间:2014-09-18 19:28:39

标签: c# http-headers console-application html-agility-pack fizzler

我的目标是从网站上读出特定的容器/标签/属性(为了我的爱好),一切正常,除了获取我的价值的德语翻译(我通常在浏览器中手动打开网站时得到的)是网站从用户代理获取特定信息),但如果我使用我的程序,它只会给我英文价值)

正在运行的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)“,而不仅仅是英文文本

可能我需要这样的user agent,我在URL中找不到一个pramameter,它告诉服务器我还想要标题信息中的德语?

我更新了两行(评论),它确实/没有改变任何内容。(来自http://www.whatsmyuseragent.com的用户代理

1 个答案:

答案 0 :(得分:6)

您需要通过向服务器发送“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;
}

lambda构造定义了一个匿名方法,简短,内联和上下文。然后使用您可能熟悉的PreRequest构造将该方法添加到+=事件处理程序列表中。 More about this construct can be found here