2011-04-30 216 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'的文檔。