如何擦除普通表中的链接?

时间:2018-01-02 14:58:18

标签: python python-3.x web-scraping python-requests

在Python 3中,我需要提取站点中表格中的链接。我这样做了

from bs4 import BeautifulSoup
from urllib.request import urlopen
import urllib.request, urllib.parse, urllib.error

geral = urlopen("http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/dados-abertos-do-cnpj")

bsObje =  BeautifulSoup(geral, "lxml")

estados = bsObje.findAll("table", {"class":"plain"})

print(estados)

输出:

[<table class="plain"><tbody><tr><th><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AC" target="_self" title="Acre">Acre</a></th><th><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214ES" target="_self" title="">Espírito Santo</a></th><th><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214PB" target="_self" title="Paraíba">Paraíba</a></th><th><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214RO" target="_self" title="Rondônia">Rondônia</a></th></tr><tr><td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AL" target="_self" title="Alagos">Alagoas</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214GO" target="_self" title="Goiás">Goiás</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214PR" target="_self" title="Paraná">Paraná</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214RR" target="_self" title="Roraima">Roraima</a></strong></td>
</tr><tr><td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AP" target="_self" title="Amapá">Amapá</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214MA" target="_self" title="Maranhão">Maranhão</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214PE" target="_self" title="Pernambuco">Pernambuco</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214SC" target="_self" title="Santa Catarina">Santa Catarina</a></strong></td>
</tr><tr><td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AM" target="_self" title="Amazonas">Amazonas</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214MT" target="_self" title="Mato Grosso">Mato Grosso</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214PI" target="_self" title="Piauí">Piauí</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214SP" target="_self" title="São Paulo">São Paulo</a></strong></td>
</tr><tr><td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214BA" target="_self" title="Bahia">Bahia</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214MS" target="_self" title="Mato Grosso do Sul">Mato Grosso do Sul</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214RJ" target="_self" title="Rio de Janeiro">Rio de Janeiro</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214SE" target="_self" title="Sergipe">Sergipe</a></strong></td>
</tr><tr><td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214CE" target="_self" title="Ceará">Ceará</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214MG" target="_self" title="Minas Gerais">Minas Gerais</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214RN" target="_self" title="Rio Grande do Norte">Rio Grande do Norte</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214TO" target="_self" title="Tocantins">Tocantins</a></strong></td>
</tr><tr><td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214DF" target="_self" title="Distrito Federal">Distrito Federal</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214PA" target="_self" title="Pará">Pará</a></strong></td>
<td><strong><a class="external-link" href="http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214RS" target="_self" title="Rio Grande do Sul">Rio Grande do Sul</a></strong></td>
<td></td>
</tr></tbody></table>]

我想提取“href”和“title”来创建列表或字典。

我尝试在estados中进行迭代,但它生成了一个空值:

for name in estados:
    url = name.get('href')
    local = name.get('title')
    print(local)
    print(url)

输出:

None
None

在这种情况下,请问如何从每个表项中提取'href'及其各自的标题?

4 个答案:

答案 0 :(得分:3)

您正在使用单个元素迭代列表。试试这个:

for name in estados[0].findAll("a"):
   url = name.get('href')
   local = name.get('title')
   print(local)
   print(url)

答案 1 :(得分:2)

根据BeautifulSoup documentation,您似乎应该将for name in estados更改为:

for name in estados.find_all('a'):

答案 2 :(得分:1)

也许在表格中使用类<a>获取所有external-link个标签会有所帮助。

from bs4 import BeautifulSoup
from urllib.request import urlopen
import urllib.request, urllib.parse, urllib.error

geral = urlopen("http://idg.receita.fazenda.gov.br/orientacao/tributaria    /cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/dados-abertos-do-cnpj")

bsObje =  BeautifulSoup(geral, "lxml")

estados = bsObje.findAll("table", {"class":"plain"})[0].findAll('a', {"class":"external-link"})

estados = {a.get('title'): a.get('href') for a in estados}
print(estados)

如果您只使用find代替findAll对第一个(可能是唯一的)表感兴趣,您也可以删除该索引:

estados = bsObje.find("table", {"class":"plain"}).findAll('a', {"class":"external-link"})

答案 3 :(得分:1)

如果我能正确理解你,那么下面的代码就会让你:

from bs4 import BeautifulSoup
import requests

dict_val={}

res = requests.get("http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/dados-abertos-do-cnpj")
soup =  BeautifulSoup(res.text, "lxml")
table = soup.select("table.plain")[0]
for items in table.select("tr"):
    data = [[item.text,item['href']] for item in items.select(".external-link")]
    for data_dict in data:
        dict_val[data_dict[0]] = data_dict[1]

print(dict_val)

部分输出:

{'Alagoas': 'http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214AL', 'Pará': 'http://idg.receita.fazenda.gov.br/orientacao/tributaria/cadastros/cadastro-nacional-de-pessoas-juridicas-cnpj/consultas/download/F.K03200UF.D71214PA',