如何提取td标签内的所有直接文本?现有代码仅能获取部分内容
解决方案
你的问题出在只获取了td的第一个子节点文本,要提取目标内容,需要遍历td的所有子节点,筛选出需要的文本部分。
方法一:使用JavaScript脚本提取
直接通过执行JS脚本遍历td的子节点,收集<p>标签文本和td的直接有效文本节点内容:
td_tag = driver.find_element(By.ID, "td_id") target_text = driver.execute_script(""" const td = arguments[0]; let finalText = ''; // 遍历所有子节点 for (const node of td.childNodes) { if (node.nodeType === Node.ELEMENT_NODE) { // 仅保留<p>标签的文本 if (node.tagName === 'P') { finalText += node.textContent.trim() + ' '; } } else if (node.nodeType === Node.TEXT_NODE) { // 过滤空白文本节点,保留有效内容 const text = node.textContent.trim(); if (text) { finalText += text + ' '; } } } // 去除末尾多余空格 return finalText.trim(); """, td_tag)
执行后target_text的值就是你需要的:Name John Smith Address: NewYork
方法二:简化JS逻辑提取
如果确认只需要<p>标签和td直接子文本,也可以用更简洁的逻辑:
td_tag = driver.find_element(By.ID, "td_id") target_text = driver.execute_script(""" const td = arguments[0]; // 获取<p>标签文本 const pContent = td.querySelector('p').textContent.trim(); // 获取td下所有有效直接文本节点 const textContents = Array.from(td.childNodes) .filter(node => node.nodeType === Node.TEXT_NODE) .map(node => node.textContent.trim()) .filter(text => text); // 拼接所有内容 return [pContent, ...textContents].join(' '); """, td_tag)
原代码问题说明
你之前用arguments[0].firstChild只获取了td的第一个子节点(这里是空白文本节点),自然只能拿到部分内容,遍历所有子节点才能覆盖所有目标文本。
内容的提问来源于stack exchange,提问作者py_js_dev
相关产品推荐
相关产品推荐

