从动态网站抓取的Pandas数据集

1 投票
1 回答
25 浏览
提问于 2025-04-14 15:43

这个问题和我之前问的一个问题有关,所以我假设我已经打开了这个esco网页上的所有“加号”。

当我展开了“处理和处置废物及危险材料”下的加号(这个技能正是上面链接指向的内容)后,我该如何从这个展开的页面中提取出一个包含两列的数据框,一列叫“技能”,另一列叫“技能代码”?在“技能”这一列中应该是技能名称,而在“技能代码”这一列中则是“父节点”的代码。在上面的示例链接中,“技能”这一列应该包含:

  • 收集工业废物
  • 处理废物
  • 管理废物
  • 协调废物管理程序
  • 设计工厂废物处理程序
  • 开发废物管理流程
  • 处理食品废物
  • 处理焊接废物
  • 处理废石
  • 管理废物处理设施
  • 与废物处理设施沟通
  • 培训员工进行废物管理

而在“技能代码”这一列中应该是技能代码 S6.13.0。

我也尝试过这样做,但结果非常糟糕:

import pandas as pd
from bs4 import BeautifulSoup

# Replace with your actual HTML file path
file_path = '/Users/federiconutarelli/Desktop/esco.html'

# Read the HTML file
with open(file_path, 'r', encoding='utf-8') as file:
   soup = BeautifulSoup(file, 'html.parser')

# Initialize lists to store skills and codes
skills = []
codes = []

# Find elements containing skills and their codes
# Replace 'skill_class_name' and 'code_class_name' with the actual class names or use other selectors based on your HTML structure
for skill_element in soup.find_all('div', class_='classification_item'):
   skill_name = skill_element.get_text(strip=True)
   skills.append(skill_name)
   
   # Assuming the code is in a close relation to the skill element, you might need to adjust the method of finding it
   code_element = skill_element.find_next_sibling('div', class_='main_item')
   if code_element:
       skill_code = code_element.get_text(strip=True)
       codes.append(skill_code)
   else:
       codes.append('')  # Append an empty string or None if no code is found

# Create a DataFrame
df = pd.DataFrame({
   'Skill': skills,
   'Code': codes
})

print(df)

注意:我把这个链接称为“示例链接”,因为实际上我有很多这样的链接,需要重复同样的操作。

1 个回答

0

我觉得锚点标签(<a>)比

标签更容易提取数据:

import re
pattern = re.compile("(.+) - (.+)")

data = []
for anchor in soup.find_all('a', class_='change_right_content'):
   skill_name = anchor.get_text(strip=True)
   if m := pattern.match(skill_name):
      data.append(m.groups())

df = pd.DataFrame(data, columns=['Code', 'Skill'])

你可以调整正则表达式的模式,让它匹配,但不匹配等等。

:=被称为“海象运算符”,需要使用Python 3.8或更高版本。

撰写回答