【问题标题】:How to wipe links in plain table?如何擦除普通表中的链接?
【发布时间】:2018-06-12 06:55:49
【问题描述】:

在 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”及其各自的标题?

【问题讨论】:

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


    【解决方案1】:

    您正在迭代具有单个元素的列表。试试这个:

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

    【讨论】:

      【解决方案2】:

      也许在您的表中获取所有带有external-link 类的&lt;a&gt; 标记会有所帮助。

      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"})
      

      【讨论】:

      • 这并没有考虑到 OP 的代码只列出 table 元素中的链接这一事实。
      • 没错,感谢您的提醒。我刚刚更改了答案以试图解释这一点。
      【解决方案3】:

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

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

      【讨论】:

        【解决方案4】:

        如果我能正确理解您,那么下面的代码将带您到达那里:

        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',
        

        【讨论】:

        • 谢谢大家。特别是在此响应中,“Espírito Santo”的标题值为空。这应该是网站上的代码错误,对吧?避免这种情况的一种方法是只刮掉文本?
        • 更新了代码。现在检查。没有空值。看到Alagoas 排在第一位不要迷惑,所有你现在可以抓取的值。
        猜你喜欢
        • 2012-11-25
        • 2013-08-15
        • 2020-12-21
        • 2012-04-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-16
        • 2021-04-17
        • 1970-01-01
        相关资源
        最近更新 更多