3

リファレンスページ:http ://www.ncbi.nlm.nih.gov/pubmed/?term = NS044283 [GR]&dispmax = 200&report = xml

<pre>XMLは、返されたHTMLページのタグの下に埋め込まれます。タグの内容を抽出すること<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 = [])
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 に答える