Traceback (most recent call last): File "C:\Users\test\Desktop\DIDI测试.py", line 55, in <module> extract_html_info(file_path, csv_writer) File "C:\Users\test\Desktop\DIDI测试.py", line 25, in extract_html_info timestamp = p_tag.find_previous('body').find_previous('head').find('meta', {'http-equiv': 'Content=-Type'})[ ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ TypeError: 'NoneType' object is not subscriptable
时间: 2023-08-04 13:06:51 浏览: 105
这个错误是因为在提取时间戳时,找不到对应的元素导致的。可能是由于HTML结构的变化或者标签属性的不一致导致无法成功提取。你可以尝试修改代码以适应不同的HTML结构。以下是修改后的代码:
```python
import os
import re
import csv
from bs4 import BeautifulSoup
# 设置html文件路径
folder_path = r'C:\Users\test\Desktop\DIDItest'
output_file = r'C:\Users\test\Desktop\output.csv'
# 提取html文件内所需要数据
def extract_html_info(file_path, csv_writer):
with open(file_path, 'r', encoding='utf-8') as file:
# 读取HTML源代码
html = file.read()
soup = BeautifulSoup(html, 'html.parser')
# 提取所有的<p>标签
p_tags = soup.find_all('p')
for p_tag in p_tags:
# 提取ID
talk_id = p_tag.find_previous(string=lambda text: isinstance(text, str) and '[talkid:' in text)
talk_id = talk_id.strip('[talkid:]')
# 提取时间
timestamp = ''
meta_tags = soup.find_all('meta', {'http-equiv': 'Content-Type'})
for meta_tag in meta_tags:
if 'charset' not in meta_tag['content']:
timestamp = meta_tag['content']
break
# 提取发送号码
send_number = p_tag.find('span', {'class': 'hint-success'}).text
# 提取接收号码
receive_number = p_tag.find_all('span', {'class': 'hint-success'})[1].text
# 提取信息内容
message = p_tag.previous_sibling.strip()
# 判断是否是音频
if '音频' in message:
file_url = p_tag.find('a')['href']
csv_writer.writerow([talk_id, timestamp, send_number, receive_number, file_url])
else:
csv_writer.writerow([talk_id, timestamp, send_number, receive_number, message])
# 创建CSV文件并写入数据
with open(output_file, 'w', newline='', encoding='utf-8') as file:
csv_writer = csv.writer(file)
csv_writer.writerow(['ID', '时间', '发送号码', '接收号码', '内容'])
# 遍历文件夹及子文件夹,提取HTML文件信息
for root, dirs, files in os.walk(folder_path):
for file in files:
if file.endswith('.html'):
file_path = os.path.join(root, file)
extract_html_info(file_path, csv_writer)
print("数据已成功写入CSV文件。")
```
在这个修改后的代码中,我修改了提取时间戳的部分。我使用了一个循环来遍历所有的`meta`标签,并通过判断`content`属性中是否包含`charset`来排除不需要的标签。找到合适的标签后,将其`content`属性赋值给`timestamp`变量。
希望这次能够顺利运行并正确提取时间戳!如果你还有其他问题,请随时提问。
阅读全文