Word VBA网页抓取:如何筛选transcript-question/answer类并跳过timestamp
Word VBA优雅抓取网页问答内容(跳过时间戳)
你完全不用事后处理字符串清理HTML,利用HTML DOM的元素选择能力就能精准搞定这个需求——直接定位目标类,自动跳过timestamp元素就行。我帮你优化了代码,不仅能按顺序抓取问答内容,还修复了原代码里一直覆盖同一个单元格的问题:
Sub ScrapeToWord() Const URL = "http://......." Dim http As New MSXML2.XMLHTTP60, html As New HTMLDocument Dim itemWrappers As Object, qaContainers As Object, qaContainer As Object Dim questionElem As Object, answerElem As Object Dim currentRow As Integer ' 初始化起始行(假设表格第一行是表头,从第二行开始写入内容) currentRow = 2 ' 发送请求获取网页内容 http.Open "GET", URL, False http.send html.body.innerHTML = http.responseText ' 获取所有transcription-item-wrapper容器 Set itemWrappers = html.getElementsByClassName("transcription-item-wrapper") ' 遍历每个外层wrapper For Each wrapper In itemWrappers ' 获取当前wrapper下的所有问答容器 Set qaContainers = wrapper.getElementsByClassName("transcript-qa") For Each qaContainer In qaContainers ' 检查并抓取提问内容 Set questionElem = qaContainer.getElementsByClassName("transcript-question") If questionElem.Length > 0 Then ActiveDocument.Tables(1).Cell(currentRow, 1).Range.Text = questionElem(0).innerText End If ' 检查并抓取回答内容 Set answerElem = qaContainer.getElementsByClassName("transcript-answer") If answerElem.Length > 0 Then ActiveDocument.Tables(1).Cell(currentRow, 2).Range.Text = answerElem(0).innerText ' 写完一组问答后,行数自动递增 currentRow = currentRow + 1 End If Next qaContainer Next wrapper ' 释放占用的对象资源 Set http = Nothing Set html = Nothing Set itemWrappers = Nothing Set qaContainers = Nothing End Sub
代码关键说明:
- 精准跳过无用元素:通过逐层遍历
transcription-item-wrapper→transcript-qa,直接在问答容器内定位transcript-question和transcript-answer,完全不用处理timestamp相关内容 - 避免内容覆盖:用
currentRow变量跟踪表格写入位置,每写完一组问答自动换行,解决原代码重复写入同一单元格的问题 - 容错性处理:通过
Length > 0判断元素是否存在,避免因部分容器无提问/回答导致代码报错 - 资源优化:最后手动释放对象,减少内存占用
内容的提问来源于stack exchange,提问作者cervelo
相关产品推荐
相关产品推荐

