使用Ruby将SEC Edgar XML文件解析为Nokogiri

时间:2011-04-30 01:47:12

标签: ruby xml parsing nokogiri stocks

我在解析SEC Edgar files

时遇到问题

Here is an example of this file

最终结果是我希望<XML></XML>之间的内容成为我可以访问的格式。

到目前为止,我的代码不起作用:

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

3 个答案:

答案 0 :(得分:3)

好的,有几件事是错的:

  1. sec.gov/Archives/edgar/data/1475481/0001475481-09-000001.txt不是XML,所以除非你从文件顶部剥下所有垃圾,否则Nokogiri对你没用到真正的XML开始的位置,然后修剪尾随标记以保持XML正确。所以,你需要先解决这个问题。
  2. 您没有从文件中说出您想要的内容。没有这些信息,我们无法推荐真正的解决方案。你需要花更多的时间来更好地定义问题。
  3. 这是一段快速代码,用于检索页面,删除垃圾,并将生成的内容解析为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
    

答案 1 :(得分: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">]>] 

应该让你去

答案 2 :(得分: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'的文档。