|
|
您发现了两个关键现象,这将帮助准确定位问题:
1. **从网页渲染区复制**(答题框可见文本)粘贴到Word,显示**Helvetica字体**。
2. **从开发者工具(元素面板)复制**相同的文本粘贴到Word,显示**monospace字体**。
这说明:**网页确实渲染了Helvetica字体,但DOM中存储的文本是普通的Unicode字符**,开发者工具用monospace字体只是代码查看习惯,与内容无关。两份文本本质应是相同的,除非有隐藏字符合并问题。
---
## 核心结论
**字体映射(如加入monospace)与DrissionPage提取文本毫无关系。** 您无法读取的文本肯定不在DrissionPage的 `.text` 能够获取的位置。我们需要从DOM结构入手。
---
## 可能的原因(根据您的描述,逐一排查)
### 1. 答题框是 `<input>` 或 `<textarea>` 元素
这类元素的 `.text` 属性为空,文本存储在 `.value` 中。
**验证方法**:检查元素标签名:
- print(item.tag) # 如果返回 'input' 或 'textarea'
复制代码
**解决方法**:改用 `.value`。
- answer = item.value # 而非 item.text
复制代码
### 2. 答题框是 `contenteditable` 的 `<div>`
有些网页用可编辑的div代替textarea,文本在 `.innerText` 或 `.textContent` 中。DrissionPage的 `.text` 通常能获取,但若div内部有复杂子元素(如span、br)可能丢失部分文本。
**尝试**:
- answer = item.raw_text # 等同于 textContent
复制代码
### 3. 文本在 Shadow DOM 中
如果答题框使用了Web Component,文本藏在 shadow-root 中,普通的选择器无法穿透。
**检测**:`print(item.html)` 查看是否包含 `#shadow-root`。
**解决**:使用 `ele.sr()` 方法进入shadow root后再提取。
### 4. 文本通过JavaScript动态写入,但DrissionPage抓取时尚未加载
您已经看到渲染正常,说明页面已完全加载。但DrissionPage获取文本时可能过早。尝试增加等待:
或针对单个元素等待:
- item = tab.wait.ele('选择器', timeout=10)
复制代码
### 5. 答案文本被放在 `aria-label` 或 `data-*` 属性中
这种设计常见于富文本编辑器(如Quill、TinyMCE),真正的文本存储在自定义属性中,显示的是渲染后的HTML。
**尝试**:
- answer = item.attr('aria-label') or item.attr('data-text') or item.attr('value')
复制代码
---
## 立即调试:打印元素的完整HTML
在您的循环中,对**无法读取的Helvetica文本元素**执行以下代码,并将输出贴出来(注意隐藏敏感信息):
- ele = tab.ele('你的定位表达式') # 替换为具体选择器
- print('Tag:', ele.tag)
- print('Value:', ele.value) # 先试试这个
- print('Raw_text:', ele.raw_text)
- print('InnerHTML:', ele.html)
- print('Attr aria-label:', ele.attr('aria-label'))
- print('Attr data-*:', ele.attr('data-text')) # 常见自定义属性
复制代码
有了这段输出,我可以立刻判断文本藏在哪里。大概率是 **`.value`** 或 **`.raw_text`** 就能解决。
以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。 |
|