我们正在使用Nokogiri来解析iTunes中的数据。在某些页面上,它有效。在其他情况下,它会失败并神秘地截断页面。
我们的代码:
# Get iTunes HTML for app bundle
itunes_url = 'https://itunes.apple.com/us/app-bundle/id918236019'
uri = URI.parse itunes_url
http = Net::HTTP.new uri.host, uri.port
http.use_ssl = true
http.verify_mode = OpenSSL::SSL::VERIFY_NONE
req = Net::HTTP::Get.new uri.request_uri
resp = http.request req
# Covnert HTML into XML for parsing
bundle_xml = Nokogiri.XML resp.body
bundle_xml.remove_namespaces!
#puts "ERRORS: #{bundle_xml.errors}"
puts "ORIGINAL\n=============\n#{resp.body}\n\n\n\n============="
puts "NOKO\n=============\n#{bundle_xml}"
即使其他iTunes页面返回错误,Nokogiri也能正确解析页面。基本上,Nokogiri神秘地删除了某个元素之后的大部分元素。
Resp.body输出:https://gist.github.com/anonymous/33ecfe82e3d22a39375a
Nokogiri输出:https://gist.github.com/anonymous/7622ef92bf430889b9f4
i18n (0.6.11, 0.6.9, 0.6.5, 0.6.4, 0.6.1)
io-console (0.3)
journey (1.0.4)
jquery-rails (3.1.1, 3.1.0, 3.0.4, 2.2.1)
json (1.8.1, 1.8.0, 1.7.7, 1.5.5)
kgio (2.8.1, 2.8.0)
mail (2.4.4)
mime (0.4.0, 0.2.0, 0.1)
mime-types (1.25.1, 1.25, 1.24, 1.23, 1.21)
mini_portile (0.6.0, 0.5.3, 0.5.2, 0.5.1)
minitest (2.5.1)
mongo (1.10.0, 1.9.2, 1.9.1)
mongo_mapper (0.12.0)
mongoid (3.1.6)
moped (1.5.2, 1.5.1)
multi_json (1.10.1, 1.9.2, 1.9.0, 1.8.4, 1.8.2, 1.8.0, 1.7.9, 1.7.7, 1.6.1)
mysql2 (0.3.16, 0.3.15)
newrelic_rpm (3.9.0.229, 3.7.3.204, 3.7.2.192, 3.6.6.147)
nokogiri (1.6.1, 1.6.0)
答案 0 :(得分:0)
通过自己尝试,我想我看到了问题。您正在解析HTML响应。
更改
bundle_xml = Nokogiri.XML resp.body
为:
bundle_xml = Nokogiri.HTML resp.body
并查看这是否适合您。
HTML解析器更宽松,处理丢失的结束标记等。
答案 1 :(得分:0)
HTML包含无效标记。 Nokogiri说:
>> @doc.errors
[
[0] #<Nokogiri::XML::SyntaxError: htmlParseEntityRef: no name>,
[1] #<Nokogiri::XML::SyntaxError: htmlParseEntityRef: no name>,
[2] #<Nokogiri::XML::SyntaxError: Tag nav invalid>
]
这可能会使内容消失,因为Nokogiri试图修复HTML以使其可用。