如何在 Python 中抓取固定宽度的文件?
How to scrape fixed-width files in Python?
在 Python 3 中,我有一系列 link 和 "fixed-width files"。它们是包含 public 公司信息的网站。每行都有关于公司的信息
示例 links:
和
我的字典里有这些 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' 留给你。
提示:使用正则表达式。
在 Python 3 中,我有一系列 link 和 "fixed-width files"。它们是包含 public 公司信息的网站。每行都有关于公司的信息
示例 links:
和
我的字典里有这些 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' 留给你。
提示:使用正则表达式。