如何用rvest按原顺序抓取YouTube直播聊天的文本与表情?
解决YouTube直播聊天文本与表情顺序保留的抓取方法
核心思路是遍历消息节点下的所有子节点,按原始顺序分别处理文本和表情,再拼接成完整内容,而不是单独提取所有文本和所有表情。
具体代码实现
library(rvest) # 假设chat_html是你已经获取到的直播聊天页面HTML messages <- html_elements(chat_html, "#message") # 定义处理单条消息的函数 process_single_message <- function(msg_node) { # 获取当前消息节点下的所有直接子节点(文本和表情都包含在内) child_nodes <- html_children(msg_node) # 逐个处理每个子节点 processed_parts <- lapply(child_nodes, function(node) { if (html_name(node) == "img") { # 提取表情的标识文本 html_attr(node, "shared-tooltip-text") } else { # 提取文本并清理前后空格,空文本则跳过 clean_text <- trimws(html_text(node)) if (clean_text != "") clean_text else NULL } }) # 把所有有效内容按顺序拼接成字符串 paste(unlist(processed_parts), collapse = " ") } # 批量处理所有消息 final_messages <- sapply(messages, process_single_message)
代码说明
html_children(msg_node):获取单条消息节点下的所有子节点,包括文本片段和表情img标签,完全保留原始顺序。- 节点判断:通过
html_name(node)区分是文本节点还是表情节点,分别处理。 trimws():清理文本片段前后的多余空格,避免出现空内容占位的情况。- 最后用
paste(..., collapse = " ")把所有内容按顺序拼接成符合要求的字符串。
运行这段代码后,你就能得到和原始消息顺序一致的内容,比如示例中的结果会是:text pt1 :yellow_heart: text pt2 :blue_heart:
内容的提问来源于stack exchange,提问作者X. C.
相关产品推荐
相关产品推荐

