如何提取Facebook群组帖子日期?首帖DOM解析遇特殊问题
提取Facebook群组首帖日期的可行方案
方法1:利用悬停弹窗提取完整日期
完全可以通过悬停弹窗提取,步骤如下:
- 定位首帖的日期触发元素(通常是显示相对时间的a/span标签)
- 用JS模拟鼠标悬停事件触发弹窗:
const dateTrigger = document.querySelector('[role="article"]:first-child [href*="/posts/"]'); dateTrigger.dispatchEvent(new MouseEvent('mouseover', { bubbles: true, cancelable: true })); - 等待100-200ms让弹窗加载(用
setTimeout),然后抓取弹窗内的文本:setTimeout(() => { const tooltip = document.querySelector('[aria-describedby*="tooltip"]'); if (tooltip) console.log(tooltip.textContent.trim()); }, 150);
方法2:直接读取隐藏的时间戳属性
Facebook会把原始时间戳存在元素的data-utime或data-timestamp属性里,首帖也有这个属性,效率极高:
- 定位首帖的日期相关元素,读取时间戳转成可读日期:
const firstPost = document.querySelector('[role="article"]:first-child'); const timestamp = firstPost.getAttribute('data-utime') || firstPost.querySelector('[data-utime]').getAttribute('data-utime'); const fullDate = new Date(parseInt(timestamp) * 1000); console.log(fullDate.toLocaleString()); // 输出格式化后的日期
方法3:优化DOM文本提取逻辑
之前遍历节点顺序混乱是因为没过滤非文本节点,试试只提取纯文本内容:
const dateContainer = document.querySelector('[role="article"]:first-child [aria-label^="Posted"]'); const dateText = Array.from(dateContainer.childNodes) .filter(node => node.nodeType === Node.TEXT_NODE) .map(node => node.textContent.trim()) .join(' ') .replace(/\s+/g, ' '); console.log(dateText);
- 用
aria-label定位更精准,Facebook会给日期容器加包含"Posted"的标签
内容的提问来源于stack exchange,提问作者Diwakar Dayal
相关产品推荐
相关产品推荐

