当前位置: 首页 > 面试题库 >

如何在Go中请求具有特定字符集的页面?

米子轩
2023-03-14
问题内容

我正在将软件从Python重写为Go。我http.Get在提取编码为的页面时遇到问题iso-8859-1。Python版本正在运行,但Go版本中没有。

这是可行的:Python

r = requests.get("https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&type=show_document&print=yes&highlight_docid=aza://27-01-2016-5A_718-2015")
r.encoding = 'iso-8859-1'
file = open('tmp_python.txt', 'w')
file.write(r.text.strip())
file.close()

这不起作用:转到

package main

import (
    "golang.org/x/net/html/charset"
    "io/ioutil"
    "log"
    "net/http"
)

func main() {
    link := "https://www.bger.ch/ext/eurospider/live/de/php/aza/http/index.php?lang=de&type=show_document&print=yes&highlight_docid=aza://27-01-2016-5A_718-2015"
    resp, err := http.Get(link)
    if err != nil {
        panic(err)
    }
    defer resp.Body.Close()

    reader, err := charset.NewReader(resp.Body, "iso-8859-1")
    if err != nil {
        panic(err)
    }

    content, err := ioutil.ReadAll(reader)
    if err != nil {
        panic(err)
    }
    log.Println(string(content))
}

我的浏览器和Python给出了相同的结果,但Go版本却没有。我该如何解决?

编辑

我认为Go可以重定向。使用Python不会发生这种情况。

编辑2

我的问题写得不好。我有两个问题:1)编码2)返回错误的页面。不知道有没有关系。

我将为第二个问题打开一个新线程。


问题答案:

NewReader的第二个参数记录为contentType而不是字符编码。这意味着它需要Content- TypeHTTP标头中的字段值。因此,正确的用法是:

reader, err := charset.NewReader(resp.Body, "text/html; charset=iso-8859-1")

这完美地工作。

注意,如果给定的contentType内部没有有用的字符集定义,它将查看主体本身以确定字符集。并且尽管此页的HTTP标头有一个清晰的

Content-Type: text/html;charset=iso-8859-1

返回的实际HTML文档定义了不同的字符集编码:

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />

如果contentType您的代码中的设置错误,它将采用HTML中错误声明的字符集编码。



 类似资料:
  • 这就是我获取XML响应的方式: 希望有人能帮我。我认为URLConnection或其中一个流需要设置为UTF-8,考虑到谷歌的响应也是用UTF-8编码的?!

  • 问题内容: 我尝试使用Apiary,并制作了一个通用模板以将JSON发送到模拟服务器并具有以下代码: 这段代码无法正确发送JSON,但我不知道为什么。每个调用中的JSON字符串可以不同。我不能用这个。 问题答案: 我对打n并不熟悉,但是使用Golang的程序包可以很好地工作(游乐场):

  • 我尝试使用Apariy,制作了一个通用模板,将JSON发送到模拟服务器,并获得以下代码: 这段代码不能正确发送JSON,但我不知道为什么。JSON字符串可以在每次调用中不同。我不能为此使用。

  • 问题内容: 使用python屏幕抓取网页时,必须知道网页的字符编码。 如果您输入的字符编码错误,则输出将被弄乱。 人们通常使用一些基本技术来检测编码。他们要么使用标头中的字符集,要么使用meta标签中定义的字符集;或者使用编码检测器(它不关心meta标签或标头)。通过仅使用这些技术中的一种,有时您将无法获得与浏览器相同的结果。 浏览器以这种方式执行此操作: 元标记始终优先(或xml定义) 当met

  • 我正在为第三方 js 库创建一个 TypeScript 定义文件。其中一个方法允许选项对象,选项对象的一个属性接受列表中的字符串:“和 我有一个选项对象的接口: 接口是否可以强制执行这一点,因此如果您将对象与属性一起包含,它将只允许可接受列表中的字符串?

  • 我有一个熊猫数据框,看起来像这样: 预期结果应该是: 如何有效地从列和整个数据帧中删除具有的所有字符串? 我尝试使用以下正则表达式: 然而,我不知道是否有更简单或更健壮的方法从我的数据框中删除所有这些子串。如何删除开头有的所有字符串? 更新 我试过: 它是有效的,但是我想知道是否有更有效的方法。可能是一个正则表达式。