我正在使用HtmlAgilityPack从几个网站阅读元描述。
我注意到它不是英文字母,它不会解码特殊字符。 (例如Japaneses字母)。
我正在使用编码UTF8 - 我应该使用别的东西。
byte[] bytes = Encoding.Default.GetBytes(item.Attributes["content"].Value);
return Encoding.UTF8.GetString(bytes);
答案 0 :(得分:1)
WebClient.DownloadString是一种有限的高级方法,它使得从根本上简单的事情变得笨拙和容易出错。
通过HTTP获取网页很简单。您提供了一个URL和一些请求标头;服务器响应一些响应头和正文的字节流。响应头通常表示文本主体的字符编码。如果没有,文本正文可能会说自己。 HTMLAgilityPack理解这一点并提供HtmlWeb类来从该交互创建HtmlAgilityPack.HtmlDocument。
var document = new HtmlWeb().Load("http://www3.nhk.or.jp/news/");
var keywords = document.DocumentNode
.SelectSingleNode("//meta[@name='keywords']")
.Attributes["content"]?.Value;
Console.WriteLine(keywords);
Console.WriteLine($@"
StreamEncoding: {document.StreamEncoding?.EncodingName}
DeclaredEncoding: {document.DeclaredEncoding?.EncodingName}
Encoding: {document.Encoding?.EncodingName}");
NHK,ニュース,NHK NEWS WEB
StreamEncoding: Unicode (UTF-8)
DeclaredEncoding:
Encoding: Unicode (UTF-8)
答案 1 :(得分:0)
根据您的评论,您的网站似乎使用的是SHIFT-JIS编码,而不是UTF-8。我已经为UTF-8和SHIFT-JIS添加了两个样本。
using (var client = new WebClient())
{
// UTF-8
var content = client.DownloadString("http://www3.nhk.or.jp/news/");
var doc = new HtmlDocument();
doc.LoadHtml(content);
var metaDescNode = doc.DocumentNode.SelectSingleNode("//meta[@name=\"description\"]");
var bytes = Encoding.Default.GetBytes(metaDescNode.Attributes["content"].Value);
var decodedMetaDesc = Encoding.UTF8.GetString(bytes); // This string has decoded characters
// Shift_JIS
var japaneseEncoding = Encoding.GetEncoding(932);
var content2 = client.DownloadString("http://www.toronto-electricians.com/");
var doc2 = new HtmlDocument();
doc2.LoadHtml(content2);
var metaDescNode2 = doc2.DocumentNode.SelectSingleNode("//meta[@name=\"description\"]");
var bytes2 = Encoding.Default.GetBytes(metaDescNode2.Attributes["content"].Value);
var decodedMetaDesc2 = japaneseEncoding.GetString(bytes2); // This string has decoded characters
}
调试器的屏幕截图#1。
调试器的屏幕截图#2。