【问题标题】:How to extract text only from parent HTML node (excluding child node)?如何仅从父 HTML 节点(不包括子节点)中提取文本?
【发布时间】:2017-01-07 14:31:45
【问题描述】:

我有一个代码:

<div class="activityBody postBody thing">
    <p>
        <a href="/forum/conversation/post/3904-22" rel="post" data-id="3904-22" class="mqPostRef">(22)</a>
        where?
    </p>
</div>

我正在使用这段代码来提取文本:

html_nodes(messageNode, xpath=".//p") %>% html_text() %>% paste0(collapse="\n")

得到结果:

"(22) where?"

但我只需要“p”文本,不包括子节点中可能位于“p”内部的文本。我必须得到这个文本:

"where"

在我获取文本时有什么方法可以排除子节点吗?

Mac OS 10.11.6 (15G31)、RSrudio 版本 0.99.903、R 版本 3.3.1 (2016-06-21)

【问题讨论】:

    标签: r web-scraping html-parsing rvest xml2


    【解决方案1】:

    如果你确定你想要的文本总是在最后,你可以使用:

    doc %>% html_nodes(xpath=".//p/text()[last()]") %>% xml_text(trim = TRUE)
    

    或者,您可以使用以下命令选择所有“非空”字符串

    doc %>% html_nodes(xpath=".//p/text()[normalize-space()]") %>% xml_text(trim = TRUE)
    

    有关normalize-space() 的更多详细信息,请参阅https://developer.mozilla.org/en-US/docs/Web/XPath/Functions/normalize-space

    第三种选择是直接通过以下方式使用xml2 包:

    doc %>% xml2::xml_find_chr(xpath="normalize-space(.//p/text())")
    

    【讨论】:

      【解决方案2】:

      这将抓取来自&lt;p&gt;children 的所有文本(这意味着它不会包含来自不是“文本发射器”的子节点的文本:

      library(xml2)
      library(rvest)
      library(purrr)
      
      txt <- '<div class="activityBody postBody thing">
          <p>
              <a href="/forum/conversation/post/3904-22" rel="post" data-id="3904-22" class="mqPostRef">(22)</a>
              where?
          </p>
        <p>
          stays 
          <b>disappears</b>
          <a>disappears</a>
          <span>disappears</span>
          stays
        </p>
      </div>'
      
      doc <- read_xml(txt)
      
      html_nodes(doc, xpath="//p") %>% 
        map_chr(~paste0(html_text(html_nodes(., xpath="./text()"), trim=TRUE), collapse=" "))
      ## [1] "where?"     "stays stays"
      

      不幸的是,这非常“有损”(您会丢失&lt;b&gt;&lt;span&gt; 等),但这个或@Floo0(也可能有损)的解决方案可能对您来说足够有效。

      如果您使用XML 包,您实际上可以编辑节点(即删除节点元素)。

      【讨论】:

      • 谢谢 Bob 和 Floo0。这正是我一直在寻找的。现在我明白了,一旦我阅读了有关 XPATH 函数的更多信息,我的大部分问题都会得到解决。再次感谢您将我引向正确的方向。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-02-18
      • 2020-06-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多