用某些行中的空字段抓取pdf

时间:2014-04-16 13:56:55

标签: python lxml pdf-scraping

我试图获得CUSIP NO。来自this pdf的状态和状态。我只想要存在字段STATUS的行("添加"或"删除")。

我目前遇到的问题是我不知道如何获取这两个字段,因为STATUS字段大部分时间都不存在,我无法找到知道线路何时结束以及何时结束的方法新的开始。

这是我的代码:

import scraperwiki
import urllib2
import lxml


TEST_URL = 'http://www.sec.gov/divisions/investment/13f/13flist2013q4.pdf'


def parse(pdf_url):
    u = urllib2.urlopen(pdf_url)
    #open the url for the PDF
    x = scraperwiki.pdftoxml(u.read())
    r = lxml.etree.fromstring(x) 
    cusips = r.xpath('//text[@left="110"]/text()') 
    issuer_desc = r.xpath('//text[@left="526"]/text()') 
    statuses = r.xpath('//text[@left="703"]') 

这是xml的一部分:

x[10000:12000]
'" font="6">D18190 95 8</text>\n<text top="258" left="226" width="9" height="12" 
font="6"> </text>\n<text top="258" left="251" width="144" height="12" font="6">DEUTSCHE BANK 
AG</text>\n<text top="258" left="526" width="27" height="12" font="6">PUT</text>\n<text
 top="283" left="110" width="102" height="12" font="6">G0083B 10 8</text>\n<text top="283"
 left="226" width="9" height="12" font="6">*</text>\n<text top="283" left="251" width="99"
 height="12" font="6">ACTAVIS PLC</text>\n<text top="283" left="526" width="27" height="12"
 font="6">SHS</text>\n<text top="283" left="703" width="45" height="12"
 font="6">ADDED</text>\n<text top="309" left="110" width="102" height="12" font="6">G0083B
 90 8</text>\n<text top="309" left="226" width="115" height="12" font="6"> ACTAVIS
 </text>\n<text top="309" left="323" width="27" height="12" font="6">PLC</text>\n<text
 top="309" left="526" width="36" height="12" font="6">CALL</text>\n<text top="309"
 left="703" width="45" height="12" font="6">ADDED</text>\n<text top="335" left="110"
 width="102" height="12" font="6">G0083B 95 8</text>\n<text top="335" left="226" width="115"
height="12" font="6"> ACTAVIS </text>\n<text top="335" left="323" width="27" height="12"
 font="6">PLC</text>\n<text top="335" left="526" width="27" height="12"
font="6">PUT</text>\n<text top="335" left="703" width="45" height="12"
   font="6">ADDED</text>\n<text top="361" left="110" width="102" height="12"
 font="6">G0129K 10 4</text>\n<text top="361" left="226" width="9" height="12" font="6">*
</text>\n<text top="361" left="251" width="117" height="12" font="6">AIRCASTLE
 LTD</text>\n<text top="361" left="526" width="27" height="12" font="6">COM</text>\n<text
 top="387" left="110" width="102" height="12" font="6">G0129K 90 4</text>\n<text top="387"
 left="226" width="133" height="12" font="6"> AIRCASTLE </text>\n<text top="387" left="341"
 width="27" height="12" font="6">LTD</text>\n<text top="387" left="526" width="36"
 height="12" font="6">CALL</text>\n<text top="413" left="110" width="102" height="12"'

编辑:如果字段与“添加”字段不同,那么hackish方式可能是使用xpath来获取和执行几个getnext()函数调用,直到STATUS应该是这样的字段。或者&#39; DELETED&#39;然后这个CUSIP没有STATUS存在。

Hackish解决方案功能:

def parse(pdf_url):
    u = urllib2.urlopen(pdf_url)
    #open the url for the PDF
    x = scraperwiki.pdftoxml(u.read())
    xl = lxml.etree.fromstring(x) 
    cusips = xl.xpath('//text[@left="110"]/text()') 
    issuer_desc = xl.xpath('//text[@left="526"]/text()') 
    statuses = xl.xpath('//text[@left="703"]') 
    cusips_elements = xl.xpath('//text[@left="110"]')
    complete_cusips = []
    for ce in cusips_elements:
        try:
            posible_status = ce.getnext().getnext().getnext().getnext().text
        except:
            print "header or non cusip related line"
        if posible_status in ['ADDED', 'DELETED']:
            complete_cusips.append([ce.text, posible_status])

0 个答案:

没有答案