python - 解析 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 文件):
解决方案
您可以更简洁地使用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
推荐阅读
- javascript - 在 Javascript 中指定文档元素
- android - 从命令行构建具有动态功能模块的 apk,无需 bundletool
- javascript - 是否可以在 Azure 中使用 sendgrid 发送电子邮件而不调用 context.done?
- javascript - 从 Chrome 浏览器中的嵌入元素打印 PDF
- java - Java 流 API 过滤器
- python - 在一次迭代中在 pandas 中标记包含关键字(关键字是列名)的“真”行
- java - 在 Kotlin 中将字符串编码为 UTF-8
- twitter-bootstrap - 仅在 XS 屏幕上显示 Bootstrap 4 导航栏折叠
- r - 传递函数模型
- web-scraping - 如何在 div 中获取 2 个不同的类文本