参考页:http://www.ncbi.nlm.nih.gov/pubmed/?term=NS044283[GR]&dispmax=200&report=xml
XML嵌入在返回的HTML页面的<pre>
标记下。
我可以提取<pre>
标记的内容,但我无法正确地将其转换为XML。
我尝试使用NodeSet类的to_xml
方法,但似乎行结尾(\n
)搞乱了解析。
以下是我的代码片段:
url = "http://www.ncbi.nlm.nih.gov/pubmed/?term=NS044283[GR]&dispmax=200&report=xml"
doc = Nokogiri::XML(open(url))
pre = doc.xpath('//pre')
xml = pre.to_xml
contents = Nokogiri::XML(xml)
articles = contents.xpath('\\PubmedArticle')
(article = [])
答案 0 :(得分:4)
既然您打算使用Nokogiri来解析它,只需拨打content
而不是to_xml
:
require 'nokogiri'
require 'open-uri'
url = "http://www.ncbi.nlm.nih.gov/pubmed/?term=NS044283[GR]&dispmax=200&report=xml"
doc = Nokogiri::XML(open(url))
pre = doc.xpath('//pre')
xml = "<root>" + pre.text + "</root>"
contents = Nokogiri::XML(xml)
articles = contents.css('PubmedArticle')
puts contents.css('ArticleTitle').map{|x| x.content}.count
=> 25
答案 1 :(得分:1)
正在检索的文档不是有效的XML或HTML。对创造它的人感到羞耻。
这是前200个字符,显示出一些混乱:
require 'open-uri'
url = "http://www.ncbi.nlm.nih.gov/pubmed/?term=NS044283[GR]&dispmax=200&report=xml"
puts open(url).read[0..200]
返回:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<pre>
<PubmedArticle>
<Medl
幸运的是,或者,也许是坚定的,Nokogiri通过对格式错误的HTML有点宽容来解决这个问题。
答案 2 :(得分:-1)
嵌入式XML无效(HTML转义)。试着忘掉它吧
...
xml = CGI.unescapeHTML(pre.to_xml) # or CGI.unescapeHTML(pre.to_s)
...