繁体   English   中英

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

[英]How to scrape fixed-width files in Python?

在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 CULURAL)

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

2.1- “ 02”表示/

2.2-接下来的14个职位是公司注册代码-从职位3开始,到16(07397388000155)/

2.3-下一个数字是会员识别码,可以是1、2或3-在位置17开始和结束-(2)/

2.4-接下来的14个位置是用于标识该成员的另一个代码-从位置18开始,到31结束-(““-在这种情况下为空)/

2.5-接下来的两个位置是另一个标识该成员的代码-从位置32开始,以33(16)结尾/

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

在这种情况下,一种可行的策略是将每个链接另存为TXT? 然后尝试分开职位? 还是有更好的方法来擦除固定宽度的文件?

您可以看一下任何URL解析模块。 我建议使用Requests ,尽管您可以使用python附带的urllib

考虑到这一点,您可以在页面中输入文本,并看到不需要输入任何内容,只需请求即可:

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

在请求的快速入门部分中了解更多信息。 我将“职位分开”留给您。

提示:使用正则表达式。

使用scrapy ,可以将链接的内容作为流读取并处理,而无需保存到文件中。 scrapy文档在这里

这里还有一个相关的问题: 如何使用Scrapy打开文件流进行读取?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM