使用html_text爬取网页时捕获冗余CSS数据的解决求助
解决R爬虫提取文本时包含CSS样式代码的问题
出现这种情况是因为目标元素中嵌套了CSS-in-JS生成的<style>标签,html_text()会提取所有子节点的文本内容,包括这些样式代码。以下是几种更可靠的解决方法:
方法1:用XPath直接定位纯文本节点
通过XPath过滤掉<style>标签下的文本,只提取实际内容的文本节点:
library(rvest) library(magrittr) "https://tomsk.drom.ru/toyota/bb/49660653.html" %>% read_html() %>% html_nodes(xpath = "//tr[2]//*[contains(@class, 'ezjvm5n0')]/text()[not(parent::style)]") %>% html_text() %>% paste(collapse = " ")
解释:
//tr[2]//*[contains(@class, 'ezjvm5n0')]定位到目标元素/text()[not(parent::style)]只选择父节点不是<style>的文本节点- 最后用
paste(collapse = " ")把分散的文本节点拼接成完整内容
方法2:移除目标元素内的style节点后提取文本
先选中目标元素,删除其中的<style>子节点,再提取文本:
library(rvest) library(magrittr) library(xml2) page <- read_html("https://tomsk.drom.ru/toyota/bb/49660653.html") target_element <- page %>% html_elements("tr:nth-child(2) .ezjvm5n0") # 移除所有嵌套的style标签 xml_remove(xml_find_all(target_element, ".//style")) # 提取干净文本 clean_text <- target_element %>% html_text(trim = TRUE)
解释:
xml_remove()直接从DOM结构中删除样式节点,从根源上避免提取到样式代码trim = TRUE可以自动去除文本前后的空白字符
方法3:正则表达式兜底(仅前两种方法失效时使用)
如果网站DOM结构变化导致前两种方法不生效,可以用正则匹配并移除CSS样式块:
raw_text <- ".css-9g0qum{line-height:1.55;}109 л.с., .css-1dauskf{-webkit-text-decoration:none;text-decoration:none;cursor:pointer;color:var(--link, hsl(209, 77%, 45%));border:none;background:none;font-size:inherit;font-weight:inherit;padding:0;text-align:left;border-bottom:1px dashed var(--light-blue-button-bg, hsl(208, 100%, 92%));}.drom-notouch .css-1dauskf:hover,.drom-touch .css-1dauskf:active{-webkit-text-decoration:none;text-decoration:none;color:var(--drom-brand, hsl(353, 100%, 43%));border-bottom:1px dashed var(--link-hover-border, hsla(353, 100%, 43%, 0.2));}налог" clean_text <- gsub("\\.css-[^{]+\\{[^}]+\\}", "", raw_text) %>% trimws()
注意:
正则方案依赖CSS样式块的格式(以.css-开头、用{}包裹),如果网站样式生成规则变化,可能会失效,因此优先推荐前两种DOM操作方法。
内容的提问来源于stack exchange,提问作者Deeproad
相关产品推荐
相关产品推荐

