Python Selenium爬取网页文本时如何保留\t制表符格式
问题根源
Selenium 调用元素的.text属性时,返回的是浏览器渲染后的可见文本,浏览器排版引擎会自动将源码中的制表符\t、连续空白字符折叠为单个普通空格,这是拿不到原始制表符的核心原因,属于浏览器渲染规则导致的结果,和爬取流程逻辑无关。
修复方案
核心思路是跳过浏览器的可见文本渲染逻辑,直接读取DOM节点存储的原始文本内容,同时修复现有代码里的隐藏问题:
- 所有获取目标文本的
.text调用,统一替换为读取元素的textContent属性,该属性会保留节点内的原始空白字符(包括制表符、换行),不会做空白折叠处理。 - 原代码while循环内的
move_on == True是相等判断语句,不会修改变量值,会触发无限死循环,需要改为赋值语句move_on = True。 - 原代码将
driver.close()写在爬取函数内,单次调用后浏览器就会被关闭,后续重复调用函数会直接报错,建议把关闭驱动的逻辑移到函数外统一处理。 - 旧版Selenium的
find_element_by_*系列接口在新版本中已经被弃用,建议统一使用By类定位元素,同时在轮询元素的逻辑里加短等待,避免高频占用CPU。
修复后的可运行代码:
import selenium from selenium.webdriver.common.by import By import time driver = selenium.webdriver.Chrome(executable_path=r"\chromedriver.exe") def get_raw_input(link_input, website_input, driver): driver.get(website_input) try: here_button = driver.find_element(By.XPATH, '/html/body/div[2]/h3/a') here_button.click() # 读取原始textContent保留制表符 raw_data = driver.find_element(By.XPATH, '/html/body/pre').get_attribute('textContent') except: move_on = False while not move_on: try: # 同样读取原始textContent raw_data = driver.find_element(By.CLASS_NAME, 'output').get_attribute('textContent') move_on = True except: time.sleep(0.3) return raw_data
验证说明:用上述方式拿到的
raw_data会完整保留原文本里的\t分隔符,直接调用.split("\t")即可正确拆分英文、法语对应内容,不会误拆分带空格的英文短语。
内容的提问来源于stack exchange,提问作者Max Davies
相关产品推荐
相关产品推荐

