gpt4 book ai didi

ruby - 如何让 Nokogiri 解析并返回 XML 文档?

转载 作者:数据小太阳 更新时间:2023-10-29 07:09:31 26 4
gpt4 key购买 nike

这是一些奇怪的例子:

#!/usr/bin/ruby

require 'rubygems'
require 'open-uri'
require 'nokogiri'

print "without read: ", Nokogiri(open('http://weblog.rubyonrails.org/')).class, "\n"
print "with read: ", Nokogiri(open('http://weblog.rubyonrails.org/').read).class, "\n"

运行此返回:

without read: Nokogiri::XML::Document
with read: Nokogiri::HTML::Document

没有 read 返回 XML,有它是 HTML?该网页被定义为“XHTML transitional”,所以一开始我认为 Nokogiri 一定是从流中读取 OpenURI 的“内容类型”,但返回的是 'text/html':

(rdb:1) doc = open(('http://weblog.rubyonrails.org/'))
(rdb:1) doc.content_type
"text/html"

这是服务器返回的内容。所以,现在我想弄清楚为什么 Nokogiri 返回两个不同的值。它似乎没有解析文本并使用试探法来确定内容是 HTML 还是 XML。

该页面指向的 ATOM 提要发生了同样的事情:

(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails'))
(rdb:1) doc.class
Nokogiri::XML::Document

(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails').read)
(rdb:1) doc.class
Nokogiri::HTML::Document

我需要能够在事先不知道它是什么的情况下解析页面,无论是 HTML 还是提要(RSS 或 ATOM),并可靠地确定它是什么。我要求 Nokogiri 解析 HTML 或 XML 提要文件的主体,但我看到了那些不一致的结果。

我以为我可以编写一些测试来确定类型,但后来我遇到了 xpaths 找不到元素,但常规搜索有效:

(rdb:1) doc = Nokogiri.parse(open('http://feeds.feedburner.com/RidingRails'))
(rdb:1) doc.class
Nokogiri::XML::Document
(rdb:1) doc.xpath('/feed/entry').length
0
(rdb:1) doc.search('feed entry').length
15

我认为 xpaths 可以与 XML 一起使用,但结果看起来也不可信。

这些测试都是在我的 Ubuntu 机器上完成的,但我在我的 Macbook Pro 上看到了相同的行为。我很想知道我做错了什么,但我还没有看到一个解析和搜索的例子给我一致的结果。谁能告诉我错误的方法?

最佳答案

这与 Nokogiri 的方式有关 parse method作品。这是来源:

# File lib/nokogiri.rb, line 55
def parse string, url = nil, encoding = nil, options = nil
doc =
if string =~ /^\s*<[^Hh>]*html/i # Probably html
Nokogiri::HTML::Document.parse(string, url, encoding, options || XML::ParseOptions::DEFAULT_HTML)
else
Nokogiri::XML::Document.parse(string, url, encoding, options || XML::ParseOptions::DEFAULT_XML)
end
yield doc if block_given?
doc
end

关键是行 if string =~ /^\s*<[^Hh>]*html/i # Probably html .当你只使用 open ,它返回一个不适用于正则表达式的对象,因此它总是返回 false。另一方面,read返回一个字符串,因此它可以被视为 HTML。在本例中是,因为它匹配该正则表达式。这是该字符串的开头:

<!DOCTYPE html PUBLIC

正则表达式匹配“!DOCTYPE”到[^Hh>]*然后匹配“html”,因此假设它是 HTML。为什么有人选择这个正则表达式来确定文件是否是 HTML 超出了我的范围。使用此正则表达式,一个以 <definitely-not-html> 之类的标记开头的文件被认为是 HTML,但是 <this-is-still-not-html>被认为是 XML。你最好远离这个愚蠢的功能并调用 Nokogiri::HTML::Document#parseNokogiri::XML::Document#parse直接。

关于ruby - 如何让 Nokogiri 解析并返回 XML 文档?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1157138/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com