gpt4 book ai didi

http - 在 Racket 中解压缩 gzipped html

转载 作者:可可西里 更新时间:2023-11-01 16:26:50 27 4
gpt4 key购买 nike

我正在尝试下载一个 html 页面,然后使用 Racket 在其上运行正则表达式。这对某些页面有效,但对其他页面无效。我最终发现这是因为一些页面被 gzip 压缩并且使用 get-pure-port 发出 HTTP GET 请求提供了 gzip 页面,这当然看起来像乱码。

我的问题:有没有办法在 Racket 中解压缩页面,以便我可以在上面运行正则表达式?

谢谢。

最佳答案

虽然良好的网络服务器不会给你 gzip 响应,除非你给他们一个 Accept-Encoding: gzip 请求 header ,但并不是每个网络服务器都是良好的。

因此,您需要查找 Content-Encoding: gzip 响应 header 并使用 gunzip-through-ports . (您可以对 Content-Encoding: deflateinflate 执行相同的操作。)

当然,要“查找响应 header ”,您不能再使用get-pure-port,您必须使用get-impure-port净化端口。伪代码:

#lang racket

(require net/url
net/head
file/gunzip)

(define u (string->url "http://www.wikipedia.org"))
(define in (get-impure-port u '("Accept-Encoding: gzip")))
(define h (purify-port in))
(define out (open-output-bytes))
(match (extract-field "Content-Encoding" h)
["gzip" (gunzip-through-ports in out)]
[_ (copy-port in out)])
(define bstr (get-output-bytes out))
(close-input-port in)

附注我认为上面的内容在第一次尝试时更容易探索。但对于生产代码 I'd probably use call/input-url帮助处理关闭端口:

#lang racket

(require net/url
net/head
file/gunzip)

(define u (string->url "http://www.wikipedia.org"))
(define bstr
(call/input-url u
(curryr get-impure-port '("Accept-Encoding: gzip"))
(lambda (in)
(define h (purify-port in))
(define out (open-output-bytes))
(match (extract-field "Content-Encoding" h)
["gzip" (gunzip-through-ports in out)]
[_ (copy-port in out)])
(get-output-bytes out))))

p.p.s.

如果不使用 curryr 和匿名函数,该版本可能会更清晰。例如:

#lang racket

(require net/url
net/head
file/gunzip)

;; Like get-impure-port, but supplied Accept-Encoding gzip request
;; header.
(define (get-impure-port/gzip u)
(get-impure-port u '("Accept-Encoding: gzip")))

;; Read response headers using purify-port, and read the response
;; entity handling gzip encoding.
(define (read-response in)
(define h (purify-port in))
(define out (open-output-bytes))
(match (extract-field "Content-Encoding" h)
["gzip" (gunzip-through-ports in out)]
[_ (copy-port in out)])
(get-output-bytes out))

(define bstr
(call/input-url (string->url "http://www.wikipedia.org")
get-impure-port/gzip
read-response))

关于http - 在 Racket 中解压缩 gzipped html,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22706088/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com