我们使用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 "ORIGINALn=============n#{resp.body}nnnn============="
puts "NOKOn=============n#{bundle_xml}"
即使其他iTunes页面返回错误,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)
通过自己尝试,我认为我看到了问题所在。您正在分析HTML响应。
更改
bundle_xml = Nokogiri.XML resp.body
至:
bundle_xml = Nokogiri.HTML resp.body
看看这是否适合你。
HTML解析器要宽松得多,可以处理缺少的结束标记等。
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以使其可用时,这可能会使内容消失。