如何在Beautifulsoup中拆分find()结果?



我是Python(也在编程)的完全初学者,我试图从这个网站(https://www1.dnit.gov.br/editais/consulta/resumo.asp?NUMIDEdital=9109)抓取一些数据。

我想用文档的名称创建一个列表("Despacho Homologatório"; "DOU Resultado de Julgamento")等)在面板"Arquivos de licitata "。我使用的代码:

from urllib.request import urlopen
from bs4 import BeautifulSoup
page = urlopen("https://www1.dnit.gov.br/editais/consulta/resumo.asp?NUMIDEdital=9109")
html = page.read().decode("utf-8")
soup = BeautifulSoup(html, "lxml")
link_panel = soup.find("ul", {"class": "links"})
links = link_panel.find_all('li')

然而,结果集对象中的每个项目都有几个标签在一起(下面的文本只是项目[0]的一部分):

print(links[0])
<li><a href="/anexo/outros/outros_edital0420_22-12_4.pdf" target="_blank"><li><a href="/anexo/outros/outros_edital0420_22-12_4.pdf" target="_blank">Publicação D.O.U. - Resultado de Julgamento PE nº 0420/2022-12</a></li>
<!--  <font color="#FF0000" size="1">(17/11/2022)</font> </font> </td>-->
<li><a href="/anexo/outros/Homologação_edital0420_22-12_0.pdf" target="_blank"><li><a href="/anexo/outros/Homologação_edital0420_22-12_0.pdf" target="_blank">Termo de Homologação - Pregão Eletrônico nº 0420/2022-12</a></li>
<!--  <font color="#FF0000" size="1">(16/11/2022)</font> </font> </td>-->
<li><a href="/anexo/outros/outros_edital0420_22-12_3.pdf" target="_blank"><li><a href="/anexo/outros/outros_edital0420_22-12_3.pdf" target="_blank">Termo de Adjudicação - Pregão Eletrônico nº 0420/2022-12</a></li>
<!--  <font color="#FF0000" size="1">(11/11/2022)</font> </font> </td>-->
<li><a href="/anexo/Ata/Ata_edital0420_22-12_2.pdf" target="_blank"><li><a href="/anexo/Ata/Ata_edital0420_22-12_2.pdf" target="_blank">Ata de Realização do Pregão Eletrônico nº 0420/2022-12</a></li>
<!--  <font color="#FF0000" size="1">(11/11/2022)</font> </font> </td>-->
<li><a href="/anexo/Ata/Ata_edital0420_22-12_0.pdf" target="_blank"><li><a href="/anexo/Ata/Ata_edital0420_22-12_0.pdf" target="_blank">Ata de Realização do Pregão Eletrônico nº 0420/2022-12</a></li>
<!--  <font color="#FF0000" size="1">(11/11/2022)</font> </font> </td>-->
<li><a href="/anexo/Relatório/Relatório_edital0420_22-12_0.pdf" target="_blank"><li><a href="/anexo/Relatório/Relatório_edital0420_22-12_0.pdf" target="_blank">Relatório de Análise da Proposta de Preços e Doc. de Habilitação (Pregoeira) - ETHOS ENGENHARIA</a></li>

如何使用find_all()分别查找每个文档?

除了使用上面的代码外,我还尝试在第一个结果(valores_links[0])中使用find_all(),但无济于事。

我想用文档的名称创建一个列表("Despacho Homologatório"; "DOU Resultado de Julgamento"等)在面板"Arquivos de licita"

您可以使用.find...的列表推导来获得a标签并过滤掉容器标签(如第一个),或者使用CSS选择器.select


With List Comprehension

link_panel = soup.find("ul", {"class": "links"})
links = [l.a for l in link_panel.find_all('li') if l.a and not l.a.li]

With.select

# link_panel is no longer necessary
links = soup.select('ul.links li>a:not(:has(li))')

对应的find

links = soup.find_all(
lambda l: l.name == 'a' and l.parent.name == 'li' 
and l.find_parent("ul", {"class": "links"}) and not l.find('li')
)

所以你可能会明白为什么我更喜欢使用CSS选择器。


您可以获取名称with.get_text

docNames = [l.get_text() for l in links]

docNames看起来像

['Despacho Homologatório',  'DOU Resultado de Julgamento', 'Termo de Ajudicação',  
'Ata da sessão publica',  'Proposta de preço adequada CSR',  
'Documentos de Habilitação CSR',  'Análise da proposta e Doc. de habilitação',  
'Resposta a 1ª diligencia - CSR',  '1ª Diligência - CSR',  '1ª Errata',  
'Anexo da 1ª Errata',  'Instrução para acesso ao processo administrativo',  
'Edital 0286/2022-15',  'DOU aviso de licitação'] 

或者您可以将名称链接作为字典列表:

# pgUrl = "https://www1.dnit.gov.br/editais/consulta/resumo.asp?NUMIDEdital=9109"
linkDocs = [{
'name':l.get_text(' ').strip(), 'filename':l.get('href','').split('/')[-1],
'link':urllib.parse.urljoin(pgUrl, l.get('href')) if l.get('href') else ''
} for l in soup.select('ul.links li>a:not(:has(li))')]# links]

linkDocs看起来像

[{'name': 'Despacho Homologatório', 'filename': 'outros_edital0286_22-15_10.pdf', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_10.pdf'},
{'name': 'DOU Resultado de Julgamento', 'filename': 'outros_edital0286_22-15_9.pdf', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_9.pdf'},
{'name': 'Termo de Ajudicação', 'filename': 'outros_edital0286_22-15_8.pdf', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_8.pdf'},
{'name': 'Ata da sessão publica', 'filename': 'Ata_edital0286_22-15_0.pdf', 'link': 'https://www1.dnit.gov.br/anexo/Ata/Ata_edital0286_22-15_0.pdf'},
{'name': 'Proposta de preço adequada CSR', 'filename': 'outros_edital0286_22-15_7.zip', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_7.zip'},
{'name': 'Documentos de Habilitação CSR', 'filename': 'outros_edital0286_22-15_6.zip', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_6.zip'},
{'name': 'Análise da proposta e Doc. de habilitação', 'filename': 'outros_edital0286_22-15_5.pdf', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_5.pdf'},
{'name': 'Resposta a 1ª diligencia - CSR', 'filename': 'outros_edital0286_22-15_4.zip', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_4.zip'},
{'name': '1ª Diligência - CSR', 'filename': 'outros_edital0286_22-15_3.pdf', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_3.pdf'},
{'name': '1ª Errata', 'filename': 'Errata_edital0286_22-15_0.pdf', 'link': 'https://www1.dnit.gov.br/anexo/Errata/Errata_edital0286_22-15_0.pdf'},
{'name': 'Anexo da 1ª Errata', 'filename': 'outros_edital0286_22-15_2.zip', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_2.zip'},
{'name': 'Instrução para acesso ao processo administrativo', 'filename': 'outros_edital0286_22-15_1.pdf', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_1.pdf'},
{'name': 'Edital 0286/2022-15', 'filename': 'Edital_edital0286_22-15_0.zip', 'link': 'https://www1.dnit.gov.br/anexo/Edital/Edital_edital0286_22-15_0.zip'},
{'name': 'DOU aviso de licitação', 'filename': 'outros_edital0286_22-15_0.pdf', 'link': 'https://www1.dnit.gov.br/anexo/outros/outros_edital0286_22-15_0.pdf'}]

顺便说一句,关于

page = urlopen("https://www1.dnit.gov.br/editais/consulta/resumo.asp?NUMIDEdital=9109")
html = page.read().decode("utf-8") 
soup = BeautifulSoup(html, "lxml")

你真的不需要这里的html变量-直接获得soup = BeautifulSoup(page, "lxml")应该也很好,因为BeautifulSoup接受打开的文件句柄等。

最新更新