【问题标题】:How to store and retrieve HTML with correct encoding?如何使用正确的编码存储和检索 HTML?
【发布时间】:2011-12-28 21:02:31
【问题描述】:

请注意这个问题随着时间的推移而演变,因为我逐渐发现解决它的最佳方法是什么。所以现在它是一个解决方案而不是一个问题:-)。

工作流程

  • 我获取html页面
  • 我存储它(磁盘上的文件)
  • 稍后我检索它来解析它
  • 以防万一,我使用 TagSoup 来解决问题
  • 我将数据解析为 HTML

请注意我说的是html页面,所以编码信息存在于标题中(在元标记中)。

每一步都是问题所在,因为在其中任何一步我都可能犯错。所以问题是如何获取数据、存储数据、检索数据并最终解析它(正确地——即在每一步都保留编码)?

【问题讨论】:

  • 您可能想尝试getContentEncoding(),并尝试将值保留在文件中(可能在xml标头标签中)或使用writeTo(..)直接写入文件,如当您在流顶部使用阅读器时,它将避免对内容进行编码/解码。
  • 数据已经有这样的header——是普通的html文件。我猜数据以字节形式出现,然后它们被解释为字符。我已经在 J​​akarta HttpClient 页面上发现了一些关于它的讨论,但这不适用于 Apache HttpClient(而且很难使用 google,因为这两者经常混合使用)。
  • 我认为正确的策略取决于您存储和重新阅读网页的原因。如果您充当代理,最安全的做法是写入和读取未解释的字节流,但我得到的印象不是您想要做的。也许你可以详细说明?
  • 老实说,您存储数据的方式会故意改变,这很奇怪。就我而言,它正在缓存数据(实时数据有过期时间),而不是代理。我这样说——我需要以这种方式存储数据,那个简单的测试——使用浏览器——将给出与加载在线页面完全相同的输出。另一种方式,我的数据和那些通过网络浏览器“保存页面(仅限 html)”存储的数据应该是相同的。

标签: java html parsing scala encoding


【解决方案1】:

保存

我发现以二进​​制形式保存和加载数据会更安全,尽管它是文本。这样我就避免了编码问题——所以除了解析器,我只使用 Array[Byte]。

org.apache.commons.io.FileUtils
  .writeByteArrayToFile(new File(filename),content)

检索和解析

G_H 指出JSoup 库具有自行检测编码的能力——只需 传递编码信息。

val data = org.apache.commons.io.FileUtils
             .readFileToByteArray(new File(filename))
val doc = org.jsoup.Jsoup.parse(new java.io
             .ByteArrayInputStream(data), null,"");

正在抓取

var content : Array[Byte] = null
val client = new org.apache.http.impl.client.DefaultHttpClient();
val httpget = new org.apache.http.client.methods.HttpGet(url);

try {
  val response = client.execute(httpget);
  val entity = response.getEntity()
  content = org.apache.http.util.EntityUtils.toByteArray(entity)

}
finally {
  client.getConnectionManager().shutdown();
}

非常感谢G_H,JSoup 是一个转折点。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    相关资源
    最近更新 更多