使用Beautiful Soup爬取静态网页韩语动词变位导出CSV问题求解
问题分析
- 你遇到的
AttributeError报错是因为此前调用find_all()得到的是元素集合(列表类型),直接在集合上调用仅支持单个节点的find()方法才触发的报错,你后续代码中改用results2.find_all("tr", class_="conjugation-row")遍历的写法已经解决了这个问题。 - CSV出现大量空单元格是因为你每抓取一条变位数据就向DataFrame追加一行,相同变位名称没有做行合并,每个动词的变位都独立生成行,其余动词对应的列自然为空。
修正后代码
import requests from bs4 import BeautifulSoup import pandas as pd # 定义待抓取的URL列表 urls = [ 'https://koreanverb.app/?search=%ED%95%98%EB%8B%A4', 'https://koreanverb.app/?search=%EB%A8%B9%EB%8B%A4', 'https://koreanverb.app/?search=%EB%A7%88%EC%8B%9C%EB%8B%A4' ] # 先从第一个URL获取所有变位名称作为统一行索引 first_resp = requests.get(urls[0]) first_soup = BeautifulSoup(first_resp.content, 'html.parser') all_rows = first_soup.find_all("tr", class_="conjugation-row") conj_names = [row.find("td", class_="conjugation-name").text.strip() for row in all_rows] # 存储所有动词的变位数据 verb_data = {} for url in urls: resp = requests.get(url) soup = BeautifulSoup(resp.content, 'html.parser') # 获取动词原形 verb_name = soup.find('dl', class_='dl-horizontal').find('dd').text.strip() # 生成当前动词的变位映射字典 conj_map = {} rows = soup.find_all("tr", class_="conjugation-row") for row in rows: name = row.find("td", class_="conjugation-name").text.strip() korean_val = row.find("td", class_="conjugation-name").find_next_sibling("td").text.strip() conj_map[name] = korean_val # 按统一的变位名称顺序存储结果 verb_data[verb_name] = [conj_map[name] for name in conj_names] # 转换为DataFrame df = pd.DataFrame(verb_data, index=conj_names) df.reset_index(inplace=True) df.rename(columns={'index': 'conjugation name'}, inplace=True) # 导出为CSV,使用utf-8-sig编码避免Excel打开韩语乱码 df.to_csv('scrape.csv', index=False, encoding='utf-8-sig') print('Verb Conjugations Collected and Appended to CSV, one per column')
代码说明
- 先抓取第一个URL的所有变位名称作为统一行索引,保证后续所有动词的变位都按相同顺序排列
- 每个动词的变位数据先存入字典,全部抓取完成后统一转换为DataFrame,同一变位名称的所有动词结果都会放在同一行,无空值
- 去掉冗余的文件提前创建逻辑,直接用pandas的
to_csv方法输出,指定编码避免韩语乱码 - 所有
conjugation-row类的行都会被完整抓取,不存在仅抓取首行的问题
内容的提问来源于stack exchange,提问作者matt
相关产品推荐
相关产品推荐

