如何解析<a>标签外的文本?HTML标点提取技术求助
问题描述
解析一段文本时,每个单词被封装为<a>标签链接,但标点符号不包含在<a>标签内容中,而是位于标签外部。现有解析代码仅能提取<a>标签内的单词,无法获取这些标点符号,求解决方法。
示例HTML结构
<table> <tbody> <tr> <td> <a href="#">Lorem</a> ", " <a href="#">Ipsum</a> ": " <a href="#">dolor</a> "." </td> <td>...</td> </tr> <tr> <td> <a href="#">sit</a> "? '" <a href="#">amet</a> "' " <a href="#">consectetur</a> "..." </td> <td>...</td> </tr> <tr> <td> <a href="#">adipisicing</a> "-" <a href="#">elit</a> "; " <a href="#">Molestias</a> "!" </td> <td>...</td> </tr> </tbody> </table>
当前使用的解析代码
from bs4 import BeautifulSoup from selenium import webdriver driver = webdriver.Chrome(executable_path="...") driver.get(url=...) soup = BeautifulSoup(driver.page_source, 'html.parser') words = [] for tableRows in soup.select("table > tbody > tr"): for word in tableRows.find("td").select("a"): words.append(word.text) print(words)
解决方案
方法1:遍历TD的所有子节点(精准控制)
这种方法可以逐个处理<td>下的每个节点,区分<a>标签和文本节点,完整保留单词与标点的顺序:
from bs4 import BeautifulSoup from selenium import webdriver driver = webdriver.Chrome(executable_path="...") driver.get(url=...) soup = BeautifulSoup(driver.page_source, 'html.parser') content_parts = [] for table_row in soup.select("table > tbody > tr"): td = table_row.find("td") # 遍历TD下的所有子节点 for node in td.contents: if node.name: # 处理<a>标签节点,提取文本 content_parts.append(node.get_text()) else: # 处理文本节点,清理多余引号和空白 cleaned_text = node.strip().strip('"') if cleaned_text: content_parts.append(cleaned_text) # 拼接成完整文本 full_content = ''.join(content_parts) print(full_content) # 若需要保留拆分后的列表形式,直接输出content_parts # print(content_parts)
方法2:直接提取TD的全部文本(简化版)
如果只需要最终的完整文本,无需拆分节点,可以直接获取<td>的所有文本后清理格式:
from bs4 import BeautifulSoup from selenium import webdriver driver = webdriver.Chrome(executable_path="...") driver.get(url=...) soup = BeautifulSoup(driver.page_source, 'html.parser') full_contents = [] for table_row in soup.select("table > tbody > tr"): td_text = table_row.find("td").get_text(strip=False) # 清理多余的引号、换行和空白 cleaned_text = td_text.replace('"', '').replace('\n', '').strip() full_contents.append(cleaned_text) print(full_contents)
内容的提问来源于stack exchange,提问作者Vahe
相关产品推荐
相关产品推荐

