Как запросить страницу с указанным c набором символов в Go? - PullRequest
0 голосов
/ 07 февраля 2020

Я переписываю программное обеспечение с 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()

Это не работает: Go

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) вернулась не та страница. Я не знаю, если есть связанные.

Я открою новую тему для второго вопроса.

1 Ответ

4 голосов
/ 07 февраля 2020

Второй аргумент NewReader задокументирован как contentType, а не как кодировка символов. Это означает, что вместо него ожидается значение поля Content-Type в заголовке HTTP. Таким образом, правильное использование будет:

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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...