2016-07-12 4 views
-1

Я использую Rails 4.2.3. У меня есть этот код, который предназначен для получения содержимого URLКак предотвратить Nokogiri от добавления ненужных тегов HTML?

doc = Nokogiri::HTML(open(url)) 

Иногда URL будет возвращать HTML, но иногда он будет возвращать JSON. Я не знаю заранее. Я заметил, что когда URL-адрес возвращает JSON, Nokgiri добавляет все эти теги HTML перед ним. Вот то, что появляется в браузере:

{"list":[{"u":"1459808276_000001","i":"1459184695_000001","pid":"RDE8UZZZ”,”fname":"Alexi","lname”:”Jones”,”sex":"F","city":"Eugene","country":"US","country_iso":"us","course":"8k","class":"elite","race":"8K","name":"Alexi Jones”,”_ver":"14","tag":"0000001","bib":"1"}],"info":{"first":"1","last":"1","total":"1","cacheVer":"0~0"}} 

Однако, когда я исполняю Nokogiri, это возвращается:

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd"> 
<html><body><p>{"list":[{"u":"1459808276_000001","i":"1459184695_000001","pid":"RDE8UZZZ”,”fname":"Alexi","lname”:”Jones”,”sex":"F","city":"Eugene","country":"US","country_iso":"us","course":"8k","class":"elite","race":"8K","name":"Alexi Jones”,”_ver":"14","tag":"0000001","bib":"1"}],"info":{"first":"1","last":"1","total":"1","cacheVer":"0~0"}}</p></body></html> 

Как предотвратить Nokogiri добавлять дополнительные вещи? Я просто хочу, чтобы он точно возвращал то, что возвращается в браузер.

Когда я пытаюсь doc = Nokogiri::HTML.fragment(open(url)), как рекомендуют другой SO ответ, я получаю ошибку:

error: undefined method `strip' for #<StringIO:0x007ff8acb34c30> 
+0

Отформатируйте ваш вопрос для удобства чтения. Усилия, которые вы вложили, помогают нам помочь вам. –

ответ

2

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

Не используйте

doc = Nokogiri::HTML(open(url)) 

Вы можете посмотреть на возвращенного заголовки HTTP для "CONTENT-TYPE", который должен быть "применение/JSON" для ответа JSON, или "TEXT/HTML" для HTML. OpenURI documentation имеет следующий пример:

open("http://www.ruby-lang.org/en") {|f| 
    f.each_line {|line| p line} 
    p f.base_uri   # <URI::HTTP:0x40e6ef2 URL:http://www.ruby-lang.org/en/> 
    p f.content_type  # "text/html" 
    p f.charset   # "iso-8859-1" 
    p f.content_encoding # [] 
    p f.last_modified # Thu Dec 05 02:45:02 UTC 2002 
} 

Или, вы можете посмотреть на первый символ возвращенного тела, который расскажет вам, будь то HTML/XML или JSON. Первые два начнутся с <, а JSON начнется либо с [, либо с {.

Нечто подобное было бы достойное начало:

content = open('http://www.example.com').read 

if content.lstrip[0] == '<' 
    # it's XML/HTML so parse it with Nokogiri 
else 
    # it's JSON so parse it with the JSON parser 
end 
Смежные вопросы