Разбор Nokogiri отличается на сервере по сравнению с локальным хостом

Я получаю некоторые странные различия при запуске Nokogiri локально по сравнению с запуском на моем сервере. На моей локальной машине кажется, что весь документ анализируется и доступен, но на сервере я, кажется, получаю вкладку doctype и некоторые случайные теги комментариев.

Для начала, чтобы убедиться, что это не проблема с open-uri, я проверил его - результаты не точны, но содержат правильную разметку.

Местный:

ruby-1.8.7-p352 :005 > s = open('http://www.pennstateind.com/store/PK2WAY.html')
=> #<File:/var/folders/G8/G8bsAGBk1o82Eyks3ZmFtq-+3Y6/-Tmp-/open-uri20120626-5891-10y2ncr-0> 
ruby-1.8.7-p352 :006 > s.length
=> 88408 

Сервер:

rb(main):008:0> s = open('http://www.pennstateind.com/store/PK2WAY.html')
=> #<File:/tmp/open-uri20120626-22167-1td2l72-0>
irb(main):009:0> s.length
=> 98184

Когда я запускаю это на своей локальной машине, я получаю следующее:

ruby-1.8.7-p352 :003 > d = Nokogiri::HTML(open('http://www.pennstateind.com/store/PK2WAY.html'))
=> [ OUTPUT OMITTED FOR BREVITY - CAN SUPPLY ON REQUEST ] 
ruby-1.8.7-p352 :004 > d.to_s.length
=> 85212  

Но когда я запускаю это на сервере, я получаю это:

rb(main):006:0> d = Nokogiri::HTML(open('http://www.pennstateind.com/store/PK2WAY.html'))
=> #<Nokogiri::HTML::Document:0x36620e14b580 name="document" children=   [#<Nokogiri::XML::DTD:0x36620e14b1c0 name="html">, #<Nokogiri::XML::Comment:0x36620e14b170 " Open Graph Tags ">, #<Nokogiri::XML::Comment:0x36620e14a98c " Customer_Session_Verified: 0 ">]>
irb(main):007:0> d.to_s.length
=> 172

Единственная очевидная разница в драгоценных камнях заключается в компиляторе JS — все остальные драгоценные камни являются точной версией между локальным и серверным:

Local => libv8 (3.3.10.4 x86-darwin-10)
Server => libv8 (3.3.10.4 x86_64-linux)

Любые идеи, как выяснить, что происходит и/или исправить это?


Обновление - чтобы определить, где на самом деле была проблема, я вытащил файл с сервера и с локального хоста, а затем запустил их на каждом. Приведенные ниже результаты показывают, что проблема определенно кроется в Нокогири - в чем проблема, я до сих пор в недоумении...

Запуск локально:

# FILE ORIGINALLY PULLED FROM SERVER

ruby-1.8.7-p352 :015 > server_file = File.open("/Users/jmcdonald/Desktop/files/SERVER.txt", "r")
=> #<File:/Users/jmcdonald/Desktop/files/SERVER.txt> 
ruby-1.8.7-p352 :016 > server_file.read.length
=> 93071 

ruby-1.8.7-p352 :022 > Nokogiri::HTML(server_file).to_s.length
=> 98793

# FILE ORIGINALLY PULLED FROM LOCALHOST

=> #<File:/Users/jmcdonald/Desktop/files/LOCAL.txt> 
ruby-1.8.7-p352 :018 > local_file.read.length
=> 89622

ruby-1.8.7-p352 :026 > Nokogiri::HTML(local_file).to_html.length
=> 94632

Работает на сервере:

# FILE ORIGINALLY PULLED FROM SERVER

irb(main):001:0> sf = File.open('/home/charlest/public_html/files/nokogiri_issue/SERVER.txt', 'r')
=> #<File:/home/charlest/public_html/files/nokogiri_issue/SERVER.txt>
irb(main):002:0> sf.read.length
=> 93071

irb(main):004:0> Nokogiri::HTML(sf).to_s.length
=> 896      # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WRONG

# FILE ORIGINALLY PULLED FROM LOCALHOST

irb(main):008:0> lf = File.open('/home/charlest/public_html/files/nokogiri_issue/LOCAL.txt', 'r')
=> #<File:/home/charlest/public_html/files/nokogiri_issue/LOCAL.txt>
irb(main):009:0> lf.read.length
=> 89622

irb(main):011:0> Nokogiri::HTML(lf).to_s.length
=> 896      # <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< WRONG

person finn0013    schedule 26.06.2012    source источник
comment
Вы пытались использовать curl или что-то подобное, чтобы увидеть, возвращает ли URL-адрес, который вы нажимаете, просто разные вещи в разных случаях?   -  person Frederick Cheung    schedule 26.06.2012
comment
Да, я использовал open-uri из irb, чтобы подтвердить, что данные, которые я получаю, действительны в обоих случаях. Размер кажется другим, но, похоже, это место, где пустое пространство было удалено на сервере, но не на локальном хосте. Фактическая разметка кажется одинаковой, когда я сравниваю их.   -  person finn0013    schedule 26.06.2012
comment
Чтобы проверить свой ответ, я просто попытался скопировать ответ из open-uri на локальном хосте, сохранил его в файл на сервере, а затем прочитал его в Nokogiri. Затем я получаю ожидаемый результат, который говорит мне, что open-uri действительно возвращает что-то другое, даже если в моем первоначальном анализе оно оказалось таким же. Идем сейчас по этому пути...   -  person finn0013    schedule 26.06.2012
comment
Я еще немного протестировал и обнаружил, что файлы из open-uri действительны и работают правильно. Различия между файлами заключались не в пробелах, а в случайном контенте, который менялся на странице каждый раз, когда ее посещали. См. обновления к моему исходному сообщению выше для получения дополнительной информации - проблема определенно заключается в Нокогири.   -  person finn0013    schedule 26.06.2012
comment
Каковы версии libxml2 на каждом хосте? Маловероятно, что Nokogiri сам по себе является причиной таких различий в синтаксическом анализе. Предположим, ваш сервер использует старую версию libxml2.   -  person x1a4    schedule 27.06.2012
comment
Я изолировал это от проблемы с экземпляром драгоценного камня Nokogiri. Во время игры я заметил, что размер документа Nokogiri был правильным всякий раз, когда я использовал глобальные драгоценные камни на сервере, а не мои связанные драгоценные камни. Итак, я сдул все свои драгоценные камни и обнаружил, что если я выполняю установку драгоценных камней, это неправильно, однако, если я скопирую драгоценный камень, который уже установлен на сервере, в мой локальный каталог драгоценных камней и снова запущу его, это правильно. Я подал заявку своему хосту, чтобы попытаться получить разъяснения о том, что они сделали для установки серверной версии. Обновлю здесь, когда узнаю больше.   -  person finn0013    schedule 27.06.2012
comment
Все еще жду ответа от моего хоста, однако при более глубоком копании сервер (CentOS) определенно использует старую версию libxml2 (2.6.26). Попросил хозяина обновить это до более поздней версии. Если они обновятся, я попробую еще раз и опубликую результаты здесь. Я предполагаю, что они настроили машину, установили все драгоценные камни, а затем скопировали их на другие машины без обновления зависимостей, таких как libxml2, но не совсем уверен - просто догадка.   -  person finn0013    schedule 27.06.2012
comment
Это решено сейчас. У моего хоста была старая версия libxml2 (2.6.26), и он сделал что-то, чтобы заставить работать гем Nokogiri на уровне сервера (хотя никто не уверен, что было сделано, чтобы заставить его работать). Я обновил пакет libxml2 для использования версии 2.8.0, обновил гем Nokogiri, и теперь он работает нормально.   -  person finn0013    schedule 28.06.2012
comment
@ x1a4 - если вы хотите поместить свой ответ в качестве ответа, я отмечу его как правильный и проголосую за него.   -  person finn0013    schedule 28.06.2012
comment
У меня точно такая же проблема с Nokogiri 2.6.2, как описано в этой проблеме github.com/ sparklemotion/nokogiri/issues/1383   -  person paulorcdiniz    schedule 27.11.2015


Ответы (3)


Похоже, ваш сервер и локальная среда используют разные версии libxml2. Известно, что в старых версиях есть странные ошибки синтаксического анализа, поэтому обновление вашего сервера до последней версии, которую вы можете (или, по крайней мере, до той же версии, которую вы используете для разработки), должно вас исправить.

person x1a4    schedule 28.06.2012
comment
Проблема действительно заключалась в том, что на сервере была установлена ​​старая версия libxml2. Обновил libxml2 до версии 2.8.0 и теперь все отлично работает. - person finn0013; 28.06.2012

Также была ошибка с поставляемой версией Nokogiri (думаю, она затрагивала 1.5.1), которая в некоторых ограниченных ситуациях влияла на синтаксический анализ. Я бы посоветовал убедиться, что ваши драгоценные камни обновлены. (обновление драгоценного камня)

person catepillar    schedule 27.06.2012
comment
Спасибо за ответ - мне не везет независимо от версии. Я пробовал этот тест со всем от 1.5.0 до 1.5.5, все с теми же результатами. См. мой комментарий выше о серверной и локальной установке — что-то определенно происходит с фактической установкой, но я жду ответа от моего хоста о том, что именно. - person finn0013; 27.06.2012

Попробуйте использовать File#read вместо File#open или убедитесь, что вы используете lf.rewind, прежде чем пытаться анализировать с помощью Nokogiri. Поведение, которое вы видите, скорее всего, является результатом того, что ваш дескриптор файла lf находится в конце файла, что означает, что Nokogiri анализирует пустой документ.

> remote = File.open('./PK2WAY.html')
# => #<File:./PK2WAY.html>
> remote.read.length
# => 92978
> remote.read.length
# => 0
> Nokogiri::HTML(remote).to_s.length
# => 108
> remote.rewind
# => 0
> Nokogiri::HTML(remote).to_s.length
# => 93847
person ezkl    schedule 27.06.2012
comment
Спасибо, это действительная проблема с этим (так что это может помочь другим), но не проблема в моем конкретном случае. Я упростил ответы, чтобы ограничить количество отображаемого текста. Пример, который я вставил, не в том порядке, в котором я его выполнял, а только в том, чтобы показать, что происходит. - person finn0013; 27.06.2012