2011-04-30 68 views
1

我在解析SEC Edgar files使用Ruby到引入nokogiri

Here is an example of this file问题解析SEC埃德加XML文件。

最终的结果是我想把<XML></XML>之间的东西变成我可以访问的格式。

这是迄今为止不工作我的代码:

scud = open("http://sec.gov/Archives/edgar/data/1475481/0001475481-09-000001.txt") 
full = scud.read 
full.match(/<XML>(.*)<\/XML>/) 
+0

“不起作用”不是很有帮助。什么不行?你想要发生什么,而发生了什么呢? – Phrogz 2011-05-01 03:19:23

回答

3

好,有几件事是错误的:

  1. sec.gov/Archives/edgar/data/1475481/0001475481-09-000001.txt不是XML,所以Nokogiri对你来说是没有用的,除非你从文件的顶部去掉所有的垃圾,直到那里真正的XML开始,然后修剪尾部标签以保持XML正确。所以,你需要首先攻击这个问题。
  2. 你不说你想从文件中得到什么。没有这些信息,我们不能推荐真正的解决方案。您需要花更多时间来更好地定义问题。

下面是一个简单的代码来检索页面,剥离垃圾,并分析得到的内容作为XML:

require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::XML(
    open('http://sec.gov/Archives/edgar/data/1475481/0001475481-09-000001.txt').read.gsub(/\A.+<xml>\n/im, '').gsub(/<\/xml>.+/mi, '') 
) 
puts doc.at('//schemaVersion').text 
# >> X0603 
+0

我觉得我不应该做gsub,而是匹配,但这是行得通的。谢谢。 – hadees 2011-05-16 06:29:50

+0

你不应该,但他们创建了一个不是XML的文件类型。您的选择是尝试正确解析而不清理它,或者清理它并获得更可预测的结果。而且,“匹配”应该为你完成什么?它只做'gsub'的功能。你会留下一些需要分析的东西。或者,也许你不明白“匹配”是什么? – 2011-05-16 07:18:46

1

我建议在IRB练习和阅读docs for Nokogiri

> require 'nokogiri' 
=> true 
> require 'open-uri' 
=> true 
> doc = Nokogiri::HTML(open('http://sec.gov/Archives/edgar/data/1475481/0001475481-09-000001.txt')) 
> doc.xpath('//firstname') 
=> [#<Nokogiri::XML::Element:0x80c18290 name="firstname" children=[#<Nokogiri::XML::Text:0x80c18010 "Joshua">]>, #<Nokogiri::XML::Element:0x80c14d48 name="firstname" children=[#<Nokogiri::XML::Text:0x80c14ac8 "Patrick">]>, #<Nokogiri::XML::Element:0x80c11fd0 name="firstname" children=[#<Nokogiri::XML::Text:0x80c11d50 "Brian">]>] 

应该让你去那个

1

鉴于这种被问了一年回来,答案很可能是OBE,但什么样的家伙应该做的是检查所有可在网站上的文件,并注意实际申请的细节,可以发现:

http://sec.gov/Archives/edgar/data/1475481/000147548109000001/0001475481-09-000001-index.htm

在此,你会看到该XML文档中后,已经被解析出来准备作进一步处理的:

http://sec.gov/Archives/edgar/data/1475481/000147548109000001/primary_doc.xml

被警告,但是,在年底的实际文件名是由文件的提交者决定,而不是由SEC。因此,您不能依赖始终为'primary_doc.xml'的文档。