使用python读取HTML文件,判断元素取出前一个相邻属性,元素的文本内容
一、在过程中遇到的坑
1、使用pyinstaller打包exe后的路径问题(找不到文件,但是.py运行正常)
解决办法:current_dir = os.path.dirname(os.path.realpath(sys.executable))
在这段代码中,os和sys都是Python内置模块,os.path是一个处理文件路径的模块,而sys.executable是一个包含Python解释器路径的变量。
这段代码的作用是获取当前正在运行的Python解释器所在的目录的绝对路径。具体来说,它通过以下步骤实现:
1、os.path.realpath(sys.executable)获取Python解释器的真实路径,即解析符号链接后的路径。
2、os.path.dirname()获取解释器路径的目录名,即去掉路径中的文件名部分,只保留路径的上一级目录名。
3、最终,current_dir变量包含了Python解释器所在的目录的绝对路径。
二、具体代码
import sys
from time import sleep
from bs4 import BeautifulSoup
import openpyxl
import os
import glob
# 获取当前文件夹路径
# current_dir = os.path.dirname(os.path.realpath(sys.executable))
#py运行时要使用__file__
current_dir = os.path.dirname(os.path.abspath(__file__))
# 使用 glob 模块查找所有的 HTML 文件
html_files = glob.glob(current_dir + "/*.html")
#定义一个空字符串
file_name = ''
# 遍历所有 HTML 文件并打印它们的文件名
for file_path in html_files:
file_name = os.path.basename(file_path)
print('你要读取的文件是:{}'.format(file_name),'\n')
# 创建一个新的workbook对象
workbook = openpyxl.Workbook()
# 选择第一个工作簿
worksheet = workbook.active
# 读取HTML文件
with open(file_name, 'r',encoding='utf-8') as f:
html_data = f.read()
# 解析HTML文件
soup = BeautifulSoup(html_data, 'html.parser')
# 查找所有class属性为'failure'的<div>元素
failure_div_elements = soup.find_all('div', {'class': 'failure'})
# 遍历所有failure_div元素
dxc = 1
for failure_div_element in failure_div_elements:
# 获取当前failure_div元素所在的父元素
parent_li_element = failure_div_element.parent
# 如果父元素是<li>元素
if parent_li_element.name == 'li':
# 查找相邻的class属性为'navigation'的前一个<li>元素
navigation_li_element = parent_li_element.find_previous_sibling('li', {'class': 'navigation'})
# 如果找到了class属性为'navigation'的<li>元素
if navigation_li_element is not None:
# 取出该元素的文本
navigation_text = navigation_li_element.text.strip()
print(navigation_text)
# 写入数据
worksheet.cell(row=dxc, column=1, value=navigation_text)
# 保存workbook
workbook.save("data.xlsx")
dxc += 1
print('\n','写入成功,生成:data.xlsx 5秒后关闭该窗口,可手动关闭')
sleep(5)
三、html示例
<li class = 'True'>取错了</li>
<div class = 'True'>取错了</div>
<li class = 'True'>取错了</li>
<div class = 'True'>取错了</div>
<li class = 'navigation'>取对了</li>
<li class = 'True'>取错了</li>
<div class = 'failure'>取错了</div>
<li class = 'True'>取错了</li>
<li class = 'True'>取错了</li>
<div class = 'True'>取错了</div>
四、运行示例
你要读取的文件是:SmokeReport20230227010508.html
Thread: XXXXXXXXXXXX
Thread: XXXXXXXXXXXXXXX
Thread: XXXXXXXXXXXXXX
Thread: XXXXXXXXXXXXXXX
Thread: XXXXXXXXXX
Thread: XXXXXXXXXXXXX
Thread: XXXXXXXXXXXXXX
Thread: XXXXXXXXXXXXXXX
写入成功,生成:data.xlsx 5秒后关闭该窗口,可手动关闭