3

参考页面:http ://www.ncbi.nlm.nih.gov/pubmed/?term=NS044283[GR]&dispmax=200&report=xml

XML 嵌入在<pre>返回的 HTML 页面的标记下。我可以提取<pre>标签的内容,但无法将其正确转换为 XML。我尝试使用to_xmlNodeSet 类的方法,但似乎行尾 ( \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 = [])
4

3 回答 3

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
于 2013-01-06T18:58:07.987 回答
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>
&lt;PubmedArticle&gt;
    &lt;Medl

幸运的是,或者,也许是坚定的,Nokogiri 通过对格式错误的 HTML 有点宽容来解决这个问题。

于 2013-01-06T19:46:51.880 回答
-1

嵌入的 XML 无效(HTML 转义)。尝试摆脱它

...
xml = CGI.unescapeHTML(pre.to_xml) # or CGI.unescapeHTML(pre.to_s)
...
于 2013-01-06T18:56:59.687 回答