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

How to scrape fixed-width files in Python?

在 Python 3 中,我有一系列 link 和 "fixed-width files"。它们是包含 public 公司信息的网站。每行都有关于公司的信息

示例 links:

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

我的字典里有这些 link。键是公司所在国家/地区的名称,值是 link

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
...

我想阅读这些 links(固定宽度文件)并将内容保存到 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 列的行,我需要用 "fixed-width files"

在 link 的每一行上进行分隔和测试

我必须遵守如下规则:

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 结束 -(“” - 在这种情况下为空)/

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

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

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

使用 scrapy 可以将 link 中的内容作为流读取并进行处理,而无需保存到文件中。 scrapy 的文档是 here

这里还有一个相关问题:

您可以查看任何 URL 解析模块。我推荐 Requests, although you can use urllib,它与 python 捆绑在一起。

考虑到这一点,您可以从页面中获取文本,并且由于它不需要任何来源的登录信息,因此只需满足以下要求即可:

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

在请求的 Quickstart 部分阅读更多内容。我会把 'position-separating' 留给你。

提示:使用正则表达式。