如何在Python中刮取固定宽度的文件?

时间:2018-01-03 09:37:45

标签: python web-scraping fixed-width

在Python 3中,我有一系列与"固定宽度文件"的链接。它们是包含公司公共信息的网站。每行都有关于公司的信息

示例链接:

http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AC

http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214RO

我在字典中有这些链接。关键是公司所在国家/地区的名称,价值是链接

for chave, valor in dict_val.items():
    print (f'Region of country: {chave} - and link with information: {valor}')

Region of country: Acre - and link with information: http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AC
Region of country: Espírito Santo - and link with information: http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214ES
...

我想阅读这些链接(固定宽度文件)并将内容保存为CSV文件。示例内容:

0107397388000155ASSOCIACAO CULTURAL                                                                                                                                                          
02073973880001552              16MARIA DO SOCORRO RODRIGUES ALVES BRAGA                                                                                                                      
0101904573000102ABREU E SILVA COMERCIO DE MEDICAMENTOS LTDA-ME  - ME                                                                                                                         
02019045730001022              49JETEBERSON OLIVEIRA DE ABREU                                                                                                                                
02019045730001022              49LUZINETE SANTOS DA SILVA ABREU                                                                                                                              
0101668652000161CONSELHO ESCOLAR DA ESCOLA ULISSES GUIMARAES                                                                                                                                 
02016686520001612              10REGINA CLAUDIA RAMOS DA SILVA PESSOA                                                                                                                        
0101631137000107FORTERM * REPRESENTACOES E COMERCIO LTDA                                                                                                                                     
02016311370001072              49ANTONIO MARCOS GONCALVES                                                                                                                                    
02016311370001072              22IVANEIDE BERNARDO DE MENEZES 

但是要填充CSV列的行,我需要使用"固定宽度文件"

分隔和测试链接的每一行

我必须遵循以下规则:

1。如果该行以" 01"开头与公司的注册号及其名称一致。示例:"0107397388000155ASSOCIACAO CULTURAL"

1.1 - " 01"表示此/

1.2 - 该行的接下来的14个职位是公司代码 - 从第3位开始到16年结束 - (07397388000155)/

1.3 - 以下150个职位是公司名称 - 从第17位开始到166结束 - (ASSOCIACAO CULTURAL)

2. 如果该行以" 02"开头它将有关于公司合作伙伴的信息。示例:"02073973880001552 16MARIA DO SOCORRO RODRIGUES ALVES BRAGA" /

2.1 - " 02"表示此/

2.2 - 接下来的十四个职位是公司注册码 - 从第3位开始到第16位结束(07397388000155)/

2.3 - 下一个数字是成员标识符代码,可以是1,2或3 - 开始和结束在第17位 - (2)/

2.4 - 接下来的十四个职位是另一个识别成员的代码 - 从第18位开始到31结束 - (&#34;&#34; - 在这种情况下为空)/ < / p>

2.5 - 接下来的两个职位是另一个识别成员的代码 - 从第32位开始到第33(16)/

结束

2.6 - 150个最终位置是合作伙伴的名字 - 从第34位开始到第183位结束(MARIA DO SOCORRO RODRIGUES ALVES BRAGA)

请在这种情况下,一种可能的策略是将每个链接保存为TXT?然后尝试分开立场? 或者有更好的方法来擦除固定宽度的文件吗?

2 个答案:

答案 0 :(得分:3)

您可以查看任何URL解析模块。我推荐Requests,尽管您可以使用与python捆绑在一起的urllib

考虑到这一点,您可以从页面中查看文本,并查看它不需要登录任何来自请求,这只是一个问题:

import requests
r = requests.get('Your link from receita.fazenda.gov.br')
page_text = r.text

Quickstart部分的请求中了解详情。我将把“位置分离”留给你。

提示:使用正则表达式。

答案 1 :(得分:2)

使用scrapy,可以将链接中的内容作为流读取并处理,而不保存到文件。 async for i, item in aiostream.stream.enumerate(cursor): ... 的文档为here

此处还有一个相关问题:How do you open a file stream for reading using Scrapy?