BeautifulSoup科普特语文本抓取格式异常问题及修正问询
解决科普特语文本抓取的格式问题
问题核心
页面通过CSS伪元素实现单词分隔和章节号显示,BeautifulSoup无法直接解析伪元素内容,导致抓取结果无单词空格、缺失章节号,无法生成1: ⲡϫⲱⲱⲙⲉ ⲙⲡⲉϫⲡⲟ ...的目标格式。
解决方案
1. 提取章节号
章节号通常存储在元素的data-*属性(伪元素内容常依赖这类属性),或嵌入在元素的style属性中。需先定位章节容器元素,再针对性提取:
from bs4 import BeautifulSoup soup = BeautifulSoup(html_content, 'html.parser') # 假设章节容器带有verse类 verse_containers = soup.find_all(class_='verse') for container in verse_containers: # 优先从data属性提取(最常见) chapter_num = container.get('data-chapter') or container.get('data-verse') # 若章节号在style的伪元素content中,解析style属性 if not chapter_num: style_attr = container.get('style', '') if 'content' in style_attr: # 提取content中的章节号,比如content: '1:' chapter_num = style_attr.split("'")[1].strip(':')
2. 修复单词分隔
若每个科普特语单词是独立的word类元素,直接遍历拼接添加空格:
# 承接上方代码,在循环内处理单词 word_elements = container.find_all(class_='word') # 提取每个单词文本并拼接 formatted_words = ' '.join([word.get_text(strip=True) for word in word_elements])
如果单词分隔完全依赖CSS伪元素(无独立单词元素),需检查页面是否有隐藏属性存储拆分后的单词(如data-word),若没有则只能根据科普特语字符特征尝试拆分(可靠性较低,优先找属性存储的内容)。
3. 生成目标格式
将章节号和格式化后的文本组合:
final_line = f"{chapter_num}: {formatted_words}" print(final_line)
示例验证
假设目标HTML结构为:
<div class="verse" data-chapter="1"> <span class="word">ⲡϫⲱⲱⲙⲉ</span> <span class="word">ⲙⲡⲉϫⲡⲟ</span> </div>
运行代码后输出:
1: ⲡϫⲱⲱⲙⲉ ⲙⲡⲉϫⲡⲟ
额外提示
如果页面是动态渲染的(章节号或单词通过JS生成),需改用selenium加载页面后再抓取,直接获取渲染后的完整文本,避免解析伪元素的麻烦。
内容的提问来源于stack exchange,提问作者bsteo
相关产品推荐
相关产品推荐

