Проблема с кодировкой CFHTTP

Я пытаюсь вытащить из нее страницу для разбора информации с помощью cfhttp. Заголовки страниц, которые я вызываю:

Кодировка содержимого: gzip

Соединение: Keep-Alive

Длина контента: 19066

Сервер: IBM_HTTP_Server

Варьировать: Accept-Encoding, User-Agent

Язык содержания: en-US

Управление кешем: no-cache="set-cookie,

set-cookie2"

Тип содержимого:

текст/html; набор символов = ISO-8859-1

Я установил кодировку в ISO-8859-1, однако я получаю следующее в FileContent (ниже показан только небольшой образец, но я думаю, что он указывает на).

Ðññ · oã · \ \ zól¯þ'vú55ðbä £ ÿÿ¾_heòññðão £ ÿÿ¾_héòññão \ þöÿë85áü a ± ° ùö} mbq¥ÝÃ8M

Я пробовал другие наборы символов и считал, что кодировка gzip вызывает проблему, но я не уверен, как проверить, если это проблема. Любые предложения или помощь будут очень оценены.

Ниже мой код

<cfhttp 
    METHOD="get"
    throwonerror="yes" 
    CHARSET="ISO-8859-1"
    URL="http://www.cars.com/for-sale/searchresults.action?sf1Dir=DESC&prMn=1&crSrtFlds=stkTypId-feedSegId-pseudoPrice&rd=100000&zc=44203&PMmt=0-0-0&stkTypId=28881&sf2Dir=ASC&sf1Nm=price&sf2Nm=miles&feedSegId=28705&searchSource=UTILITY&pgId=2102&rpp=10">

    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0">
    <cfhttpparam type= "Header" name= "TE" value= "deflate;q=0" >
</cfhttp>

<cfset listings = #cfhttp.FileContent#>
<cfoutput>
    #listings#
</cfoutput>

Я также пробовал заголовки:

    <cfhttpparam type="Header" name="Accept-Encoding" value="*">
    <cfhttpparam type= "Header" name= "TE" value= "deflate;q=0" >

И попытался удалить заголовок «Accept-Encoding» и просто оставить TE.

ОБНОВЛЕНИЕ: я до сих пор не разобрался, но нашел кое-что, что может помочь кому-то помочь мне. Когда я использовал свой тестовый php-сервер для запуска file_get_contents на той же странице, и он работал нормально, то, если я запускал тот же код cfhttp для вызова php-страницы, которая вызывала нужную мне страницу, все работало нормально. Спасибо за предложения.


person Patcouch22    schedule 04.06.2010    source источник


Ответы (3)


Проблема с cars.com, похоже, заключается в том, что они дважды сжимают выходные данные (на основе эта тема)

Итак, нам нужно разархивировать содержимое... снова...

Во-первых, нам нужно получить содержимое в виде двоичного файла, поэтому вызов CFHTTP должен включать

getasbinary="yes"

Затем нам нужно распаковать его.

Для этого мы можем использовать java.util.zip. gunzip — это модифицированная версия этой функции cflib.org:

<cfhttp
    getasbinary="yes"
    METHOD="get"
    throwonerror="yes"
    CHARSET="ISO-8859-1"
    URL="http://www.cars.com/for-sale/searchresults.action?sf1Dir=DESC&prMn=1&crSrtFlds=stkTypId-feedSegId-pseudoPrice&rd=100000&zc=44203&PMmt=0-0-0&stkTypId=28881&sf2Dir=ASC&sf1Nm=price&sf2Nm=miles&feedSegId=28705&searchSource=UTILITY&pgId=2102&rpp=10" >

    <cfhttpparam type="Header" name="Accept" value="application/xml,application/xhtml+xml,text/html;q=0.9,text/plain;q=0.8,image/png,*/*;q=0.5">
    <cfhttpparam type="Header" name="User-Agent" value="Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_5_8; en-US) AppleWebKit/534.7 (KHTML, like Gecko) Chrome/7.0.517.41">
    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate">
    <cfhttpparam type="Header" name="TE" value="deflate, chunked, identity, trailers">

</cfhttp>

<cfset unzippedHTML = gunzip(cfhttp.FileContent)>

<cfoutput>
    #unzippedHTML#
</cfoutput>

<cfscript>

    function gunzip(inBytes) {
        var gzInStream = createObject('java','java.util.zip.GZIPInputStream');
        var outStream = createObject('java','java.io.ByteArrayOutputStream');
        var inStream = createObject('java','java.io.ByteArrayInputStream');
        var buffer = repeatString(" ",1024).getBytes();
        var length = 0;
        var rv = "";

        try {
            inStream.init(inBytes);
            gzInStream.init(inStream);
            outStream.init();
            do {
                length = gzInStream.read(buffer,0,1024);
                if (length neq -1) outStream.write(buffer,0,length);
            } while (length neq -1);
            rv = outStream.toString();
            outStream.close();
            gzInStream.close();
            inStream.close();
        }
        catch (any e) {
            rv = "";
            try {
                outStream.close();
            } catch (any e) { }
                try {
                    gzInStream.close();
                } catch (any e) {
                    try {
                        inStream.close();
                    } catch (any e) {}
                }
        }
        return rv;
    }
</cfscript>

Обязательно дважды проверьте переменную области видимости функции. Я мог что-то упустить.

person Edward M Smith    schedule 04.11.2010
comment
Рад слышать это! Это было забавно выяснить. - person Edward M Smith; 05.11.2010

В заголовке вы видите сжатое содержимое файла. Его нужно будет распаковать, прежде чем он будет вам полезен. Я предполагаю, что вы можете сделать это с помощью cfzip, но у вас нет опыта в этом.

Это сообщение кажется укажите, что вы можете добавить заголовок в свой запрос, чтобы он был распакован/сдут перед возвратом:

<cfhttp ...>
    <cfhttpparam type="Header" name="Accept-Encoding" value="deflate;q=0">
    <cfhttpparam type="Header" name="TE" value="deflate;q=0">
</cfhttp>
person Daniel Sellers    schedule 04.06.2010
comment
Похоже, проблема не в этом, это была моя первая мысль, но если бы у меня возникла эта проблема, я бы столкнулся с ошибкой подключения. Кажется, это скорее проблема с кодировкой, но в то же время кодировка не работает. - person Patcouch22; 04.06.2010

Первое, что я хотел бы сделать, это убедиться, что проблема не в исходном контенте/сервере, попробовав тот же код на других страницах. Если они работают нормально, то, скорее всего, это сервер/контент, который вы пытаетесь использовать. Если у них такая же проблема, то проблема в вашем коде. Также было бы полезно, если бы вы разместили свой код.

person Adam Tuttle    schedule 04.06.2010
comment
Спасибо, похоже, это проблема с контентом, который я пытаюсь использовать, но не на сервере, поскольку я могу использовать cfhttp для любых файлов css или js, но это просто страницы html. - person Patcouch22; 04.06.2010