首页 > 解决方案 > 解析 atom 文件时出现问题:python 中的 bs4 + list + re.compile()

问题描述

我编写了一些代码来搜索与任何值列表匹配的所有标签,然后在为 True 时获取兄弟标签。当我一个一个搜索值时,输出还可以,但是当我一起搜索时,有些丢失了……我想应该是关于re.compile()的错误,但我不知道是哪一个.

任何帮助将不胜感激,在此先感谢!

link_economics=[]
number_contracts=len(soup.find_all('entry'))
for i in range(0,number_contracts):
    try: 
        link_list = list()
        economic_list=['Apertura econ(o|ó)mica','criterios evaluables mediante f(o|ó)rmulas']
        eco_list=re.compile('(.*{0}.*)'.format('|'.join(economic_list)),re.I)
        for link_1_tags in soup.find_all('entry')[i].find('cac-place-ext:ContractFolderStatus').find_all('cac-place-ext:GeneralDocument'):
            if eco_list.match(link_1_tags.find('cac-place-ext:GeneralDocumentDocumentReference').find('cac:Attachment').find('cac:ExternalReference').find('cbc:FileName').get_text()):
                link_1_tags_1=link_1_tags.find('cac-place-ext:GeneralDocumentDocumentReference').find('cac:Attachment').find('cac:ExternalReference').find('cbc:URI').get_text()
                link_list.append(link_1_tags_1)
            else:
                continue
        link_economics.append(link_list)
    except:
        link_economics.append('NaN') 

文件结构的一个例子是:

<entry>
    <cac-place-ext:ContractFolderStatus> 
        <cac-place-ext:GeneralDocument> 
            <cac-place-ext:GeneralDocumentDocumentReference>
                <cac:Attachment>
                    <cac:ExternalReference>
                        <cbc:URI>https://...</cbc:URI>
                        <cbc:FileName>Informe valoración criterios evaluables mediante fórmulas</cbc:FileName>

可以在此处找到扩展示例(来自西班牙财政部的 zip 文件):

https://contrataciondelestado.es/sindicacion/sindicacion_643/licitacionesPerfilesContratanteCompleto3_202012.zip

标签: pythonregexlistparsingbeautifulsoup

解决方案


您可以更简洁地使用select和使用find_previous_sibling(注意小写uri)。我也切换到re.search.

import re
from bs4 import BeautifulSoup

soup = BeautifulSoup('''
    <entry>
    <cac-place-ext:ContractFolderStatus> 
        <cac-place-ext:GeneralDocument> 
            <cac-place-ext:GeneralDocumentDocumentReference>
                <cac:Attachment>
                    <cac:ExternalReference>
                        <cbc:URI>https://...</cbc:URI>
                        <cbc:FileName>Informe valoración criterios evaluables mediante fórmulas</cbc:FileName>''', "lxml")


link_economics=[]
number_contracts=len(soup.find_all('entry'))
economic_list=['Apertura econ(o|ó)mica','criterios evaluables mediante f(o|ó)rmulas']
eco_list=re.compile('(.*{0}.*)'.format('|'.join(economic_list)),re.I)
  
for i in range(0,number_contracts):
    link_list = list()
    try:  
        for link_1_tag in soup.select('cbc\:FileName'):
            if re.search(eco_list, link_1_tag.get_text()):
                link_list.append(link_1_tag.find_previous_sibling('cbc:uri').text)
            else:
                continue
        link_economics.append(link_list)
    except:
        link_economics.append('NaN') 

link_economics

推荐阅读