
在Web自动化测试或数据抓取过程中,我们经常需要从HTML元素中提取文本内容。然而,当一个标签内同时包含子元素和直接文本节点时,标准的Selenium方法(如element.text或获取firstChild的textContent)往往无法满足精确提取“直接文本”的需求。例如,考虑以下HTML结构:
<td id="td_id">
<p>Name</p>
<div class="aritcle_card">
<a class="aritcle_card_img" href="/ai/2373">
<img src="https://img.php.cn/upload/ai_manual/001/246/273/176239923777053.png" alt="论小文">
</a>
<div class="aritcle_card_info">
<a href="/ai/2373">论小文</a>
<p>可靠的论文写作助手,包含11种学术写作类型,万字论文一键生成,可降重降AIGC,参考文献真实可标注,图表代码均可自定义添加。</p>
<div class="">
<img src="/static/images/card_xiazai.png" alt="论小文">
<span>431</span>
</div>
</div>
<a href="/ai/2373" class="aritcle_card_btn">
<span>查看详情</span>
<img src="/static/images/cardxiayige-3.png" alt="论小文">
</a>
</div>
<p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>
<div>
<span>agdsf</span>
</div>
John Smith
<span>dfsdf</span>
Address:
<br>
NewYork
</td>如果我们的目标是提取
Name
立即学习“前端免费学习笔记(深入)”;
和agdsf中的文本,导致结果过于宽泛。Name
立即学习“前端免费学习笔记(深入)”;
元素,其textContent会是“Name”,或者如果第一个是文本节点,则只获取该文本节点。这无法获取到所有直接文本节点。为了精确地提取
以下是实现这一目标的Python和JavaScript组合代码:
from selenium import webdriver
from selenium.webdriver.common.by import By
# 假设 driver 已经初始化并导航到包含目标元素的页面
# driver = webdriver.Chrome()
# driver.get("your_page_url.html")
# 为了演示,我们模拟一个 driver 和 td_tag
class MockWebElement:
def __init__(self, element_id):
self.id = element_id
def find_element(self, by, value):
if by == By.ID and value == "td_id":
return self
raise Exception("Element not found")
def execute_script(self, script, element):
# 模拟浏览器执行JS并返回结果
if element.id == "td_id":
# 这里的JS会根据上面提供的DOM结构进行模拟计算
# 实际浏览器会直接执行并返回
dom_structure = """
<td id="td_id">
<p>Name</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>
<div>
<span>agdsf</span>
</div>
John Smith
<span>dfsdf</span>
Address:
<br>
NewYork
</td>
"""
# 简化模拟,直接返回预期结果
return "John Smith Address: NewYork"
return ""
# 真实场景下,您会这样初始化 driver
driver = webdriver.Chrome() # 或其他浏览器驱动
driver.get("file:///path/to/your/html/file.html") # 替换为您的HTML文件路径或网页URL
# 定位目标 td 元素
td_tag = driver.find_element(By.ID, "td_id")
# 执行JavaScript代码来提取所有直接文本节点
all_direct_text = driver.execute_script("""
var node = arguments[0]; // 获取Selenium传递过来的元素
var text = '';
// 遍历目标元素的所有直接子节点
for (var child = node.firstChild; child; child = child.nextSibling) {
// 检查子节点是否为文本节点 (Node.TEXT_NODE === 3)
if (child.nodeType === Node.TEXT_NODE) {
// 如果是文本节点,则将其内容添加到结果字符串中,并去除首尾空白
text += child.textContent.trim() + ' ';
}
}
// 返回最终结果,并去除末尾可能多余的空格
return text.trim();
""", td_tag)
print(f"提取到的直接文本内容: \"{all_direct_text}\"")
# 完成后关闭浏览器
driver.quit()代码解析:
对于给定的DOM结构:
<td id="td_id">
<p>Name</p><p><span>立即学习</span>“<a href="https://pan.quark.cn/s/cb6835dc7db1" style="text-decoration: underline !important; color: blue; font-weight: bolder;" rel="nofollow" target="_blank">前端免费学习笔记(深入)</a>”;</p>
<div>
<span>agdsf</span>
</div>
John Smith
<span>dfsdf</span>
Address:
<br>
NewYork
</td>上述代码的输出将是:
提取到的直接文本内容: "John Smith Address: NewYork"
解释:
Name
立即学习“前端免费学习笔记(深入)”;
、通过这种结合Selenium和JavaScript的方法,您可以更灵活、更精确地从复杂的HTML结构中提取所需文本,从而提高自动化脚本的健壮性和准确性。
以上就是Selenium中提取HTML标签内所有直接文本节点内容的高级技巧的详细内容,更多请关注php中文网其它相关文章!
HTML怎么学习?HTML怎么入门?HTML在哪学?HTML怎么学才快?不用担心,这里为大家提供了HTML速学教程(入门课程),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号