python - python - 使用reg表达式拆分beautifulsoup对象
问题描述
我无法找到一个解决方案来拆分包含在我使用 beautifulsoup 抓取的“div”中的时间段和路线。以下是我从交互式外壳中获得的文本。我需要拆分“通过 I-405/I-65/I-525”和“8 分钟”。46 秒。然后我需要去掉'min'和'sec',这样我才能结合起来得到'8.46'。我猜我需要将 split 与正则表达式一起使用?有人可以给我一个这样的例子吗?谢谢。
这是我从网页上刮下来的:
<div class="coloredodd" id="odContent">
<b>via I-405/I-65/I-525</b>
<br></br>
58 min. 8 sec.
<br></br>
</div>
这是我从 shell 运行的内容:
>>> soup.find_all('div')[16].get_text()
'via I-405/I-65/I-5258 min. 46 sec.'
这是我要对字典做的事情:
LinkNames[1] = TempLinkNames[7]
LinkNames[2] = TempLinkNames[8]
LinkNames[3] = TempLinkNames[9]
LinkNames[4] = TempLinkNames[4]
LinkNames[5] = TempLinkNames[2]
LinkNames[6] = TempLinkNames[5]
LinkNames[7] = TempLinkNames[3]
LinkNames[8] = TempLinkNames[0]
LinkNames[9] = TempLinkNames[1]
print(LinkNames)
这是字典的第一项:
{'At BTI Road via Ocean Expy (I-525)': '32.48',
这是我先将键和值放入列表然后手动将其分配给字典的方法。
BWPLinkNames = {BWPCombineNames[6]: BWPSingLinkTime[6],
BWPCombineNames[7]: BWPSingLinkTime[7],
BWPCombineNames[8]: BWPSingLinkTime[8],
BWPCombineNames[9]: BWPSingLinkTime[9],
BWPCombineNames[4]: BWPSingLinkTime[4],
BWPCombineNames[2]: BWPSingLinkTime[2],
BWPCombineNames[5]: BWPSingLinkTime[5],
BWPCombineNames[3]: BWPSingLinkTime[3],
BWPCombineNames[0]: BWPSingLinkTime[0],
BWPCombineNames[1]: BWPSingLinkTime[1]}
无法将字典项输出到电子表格。该值是浮点字符串“23.25”。但在电子表格上,它显示不正确并出现错误。它只显示为一位数字,该数字与实际的浮点字符串无关。将 xlsxwriter 用于 excel,这是我输出它们的方式。
for key in BWLinkNames.keys():
worksheet.write(row, col, key)
for value in BWLinkNames[key]:
worksheet.write(row, col + 1, value)
row+= 1
workbook.close()
解决方案
您可以使用re.findall
:
import re
s = 'via I-405/I-65/I-5258 min. 46 sec.'
[timestamp] = re.findall('\d{1}\smin\.\s\d+\ssec', s)
final_result = '.'.join(re.findall('\d+', timestamp))
输出:
'8.46'
编辑:您可以使用BeautifulSoup
找到目的地,然后使用str.replace
:
from bs4 import BeautifulSoup as soup
import re
s = """
<div class="coloredodd" id="odContent">
<b>via I-405/I-65/I-525</b>
<br></br>
58 min. 8 sec.
<br></br>
</div>
"""
destination = soup(s, 'html.parser').find('b').text
timestamp = '.'.join(re.findall('\d+', soup(s, 'html.parser').find('div').text.replace(destination, '')))
输出:
'via I-405/I-65/I-525'
'58.8'
编辑:而不是迭代BWLinkNames[key]
,简单地利用BWLinkNames[key]
:
for i, key in enumerate(BWLinkNames):
worksheet.write(i, col, key)
worksheet.write(i, col + 1, BWLinkNames[key])
workbook.close()
推荐阅读
- swift4.2 - 从 Swift 中的两个数组生成一个字典数组
- javascript - 从多个工作簿/工作表中提取范围
- php - 使用 laravel 中的密钥连接到加密的 sqllite
- spring - How to use Transactional annotation when config transactionManager conditionally in spring?
- c# - 如何在 Web API 的 Owin 身份验证的 Provider 类中获取 Windows 登录?
- c++ - 如何在三元运算中使用“返回”作为宏?
- bash - 需要监视特定目录中的文件并将它们移动到文件夹
- c++11 - Arduino 的 C++ 中的“WriteCallback”是什么?
- microsoft-graph-api - Microsoft Graph API 是否在后面使用 SMTP?
- javascript - 如何检查元素是否高于自身?