使用Beautiful Soup爬取网页时首字符变为点的问题求助
解决Beautiful Soup get_text()提取文本首字符异常问题
问题根源
你遇到的首字符被点号覆盖的问题,本质是原始HTML结构存在严重语法错误:
- 存在未闭合的
<td>、<tr>标签 - 有孤立的文本节点(比如
<br/>后的.、游离的2023 07:45 Uhr.) - 错误放置的属性(比如
colspan="2"直接出现在文本中)
这些错误导致Beautiful Soup的HTML解析器无法正确识别节点边界,把零散的无效字符和有效文本拼接在了一起。
解决方案
方案1:精准筛选有效节点
直接定位包含有效内容的<td class="info">标签,提取文本后过滤无效内容:
from bs4 import BeautifulSoup html = '''<table class="info"> <tr class="info"><th align="center" class="info" colspan="2">Nachrichten zum Tag</th></tr> <br/>.</td></tr>><td class="info" colspan="2">Information: Room. <br/>.</td></tr>2023 07:45 Uhr. colspan="2">Update: <br/>.</td></tr>><td class="info" colspan="2">Heute. </table>''' soup = BeautifulSoup(html, 'html.parser') # 提取所有class为info的td标签文本,过滤无效内容 valid_content = [] for td in soup.find_all('td', class_='info'): # 去除首尾空白,分割掉多余的点号 text = td.get_text(strip=True).split('.')[0] + '.' if text.strip() and not text.startswith('.'): valid_content.append(text) # 拼接成预期结果 final_result = ' '.join(valid_content) print(final_result) # 输出: Information: Room. Update: Heute.
方案2:清理提取后的原始文本
如果无法精准定位节点,可以先提取所有文本,再用正则清理无效字符:
from bs4 import BeautifulSoup import re html = '''<table class="info"> <tr class="info"><th align="center" class="info" colspan="2">Nachrichten zum Tag</th></tr> <br/>.</td></tr>><td class="info" colspan="2">Information: Room. <br/>.</td></tr>2023 07:45 Uhr. colspan="2">Update: <br/>.</td></tr>><td class="info" colspan="2">Heute. </table>''' soup = BeautifulSoup(html, 'html.parser') raw_text = soup.get_text() # 替换孤立的点号,清理多余空白 cleaned_text = re.sub(r'\s*\.\s*', ' ', raw_text) # 匹配并提取有效内容片段 match = re.search(r'(Information: Room\.).*?(Update: Heute\.)', cleaned_text) if match: final_result = ' '.join([match.group(1), match.group(2)]) print(final_result) # 输出: Information: Room. Update: Heute.
额外建议
如果可以控制HTML来源,优先修复HTML的语法错误,比如补全闭合标签、移除无效的孤立文本,这样解析器能更准确地识别内容结构,避免后续的文本清理工作。
内容的提问来源于stack exchange,提问作者Konsti_x08
相关产品推荐
相关产品推荐

