【问题标题】:Separate HTML document单独的 HTML 文档
【发布时间】:2015-01-31 02:04:35
【问题描述】:

我正在使用 R 中的 XML 库并希望将 HTML 分成块

myHTML <- htmlTreeParse("myHTMLfile.HTML", useInternal=T)
unlist(xpathApply(myHTML, '//div', xmlValue))

这很好用,并为我提供了一个长字符串向量。但是,理想情况下,我想将我的 HTML 分成几块。 HTML结构如下:

    <DOC>
       <div>
           Document 1 - Element 1
       </div>

       <div>
           Document 1 - Element 2
       </div>

       <div>
           Document 1 - Element 3
       </div>

    </DOC>

    <DOC>
       <div>
           Document 2 - Element 1
       </div>

       <div>
           Document 2 - Element 2
       </div>

       <div>
           Document 2 - Element 3
       </div>

    </DOC>

所以我想要一个列表,其中每个元素对应一个中的内容,每个列表的元素都是字符串向量,包含每个DOC的元素1、2、3。

我很难 (A) 甚至查询“DOC”,因为它不是命名空间的一部分?? (B) 得到这种字符串向量列表输出。

所以而不是这个输出

[1] "Document 1 - Element 1"
[2] "Document 1 - Element 2"
[3] "Document 1 - Element 3"
[4] "Document 2 - Element 1"
[5] "Document 2 - Element 2"
[6] "Document 2 - Element 3"

我希望得到这个:

[[1]]
    [1] "Document 1 - Element 1"
    [2] "Document 1 - Element 2"
    [3] "Document 1 - Element 3"
[[2]]
    [1] "Document 2 - Element 1"
    [2] "Document 2 - Element 2"
    [3] "Document 2 - Element 3"

非常感谢您的帮助!

这是我要处理的 html 文件的示例:

https://raw.githubusercontent.com/sytpp/sample-files/master/data_3.html

【问题讨论】:

    标签: html xml r xpath html-parsing


    【解决方案1】:

    这是另一种可能性。我们可以使用readHTMLList作为getNodeSet中的函数调用

    library(XML)
    getNodeSet(xmlParseString(txt), "//DOC", fun = readHTMLList)
    #[[1]]
    #[1] "Document 1 - Element 1" "Document 1 - Element 2" "Document 1 - Element 3"
    #
    #[[2]]
    #[1] "Document 2 - Element 1" "Document 2 - Element 2" "Document 2 - Element 3"
    

    或者我们也可以试试

    lapply(xmlParseString(txt)["DOC"], readHTMLList)
    # $DOC
    # [1] "Document 1 - Element 1" "Document 1 - Element 2"
    # [3] "Document 1 - Element 3"
    # 
    # $DOC
    # [1] "Document 2 - Element 1" "Document 2 - Element 2"
    # [3] "Document 2 - Element 3"
    

    txt 在哪里

    txt <- "<DOC>\n       <div>\n           Document 1 - Element 1\n       </div>\n\n       <div>\n           Document 1 - Element 2\n       </div>\n\n       <div>\n           Document 1 - Element 3\n       </div>\n\n    </DOC>\n\n    <DOC>\n       <div>\n           Document 2 - Element 1\n       </div>\n\n       <div>\n           Document 2 - Element 2\n       </div>\n\n       <div>\n           Document 2 - Element 3\n       </div>\n\n    </DOC>"
    

    从您给定的网址,我能够得到以下结果

    library(RCurl)
    content <- getURL(url)
    doc <- htmlTreeParse(content, useInternal=TRUE)
    values <- getNodeSet(doc, "//div", fun = xmlValue, trim = TRUE)
    str(values[1:6])
    # List of 6
    # $ : chr "1 of 3 DOCUMENTS"
    # $ : chr "The Daily Telegraph (London)"
    # $ : chr "November 1, 2014 Saturday  Edition 1; National Edition"
    # $ : chr "THE WEEK IN WESTMINSTER"
    # $ : chr "SECTION: FEATURES; Pg. 26"
    # $ : chr "LENGTH: 500 words"
    length(values)
    #[1] 39 
    

    【讨论】:

      【解决方案2】:

      这个怎么样。

      library(XML)
      dd<-xmlInternalTreeParse("<DOCS><DOC>
             <div>Document 1 - Element 1</div>
             <div>Document 1 - Element 2</div>
             <div>Document 1 - Element 3</div>
      </DOC><DOC>
             <div>Document 1 - Element 3</div>
             <div>Document 1 - Element 3</div>
             <div>Document 1 - Element 3</div>
      </DOC></DOCS>")
      
      
      xmlApply(dd["//DOC"], function(x) xpathSApply(x,".//div", xmlValue))
      

      我们找到所有 DOC 元素,然后找到每个 DOC 的所有 div,因此我们将外部 xmlApply 与内部 DIV 元素相结合以从 div 中提取文本

      【讨论】:

      • 是的,这个例子很有意义,但是当我将它应用到我的 html 时,我得到一个空列表()。我可以与您分享一个包含 3 个 元素的真实示例 html 吗?
      • 如果您使用更准确地反映您的情况的示例数据更新您的问题会更好。
      • 我添加了一个文件链接,它是从 LexisNexis 下载的:raw.githubusercontent.com/sytpp/sample-files/master/data_3.html
      【解决方案3】:

      类似这样的:

      dat <- c("Document 1 - Element 1",
       "Document 1 - Element 2",
       "Document 1 - Element 3",
       "Document 2 - Element 1",
       "Document 2 - Element 2",
       "Document 2 - Element 3")
      
      split(dat, sapply(strsplit(dat, " - " ), "[", 1))
      
      ## $`Document 1`
      ## [1] "Document 1 - Element 1"
      ## [2] "Document 1 - Element 2"
      ## [3] "Document 1 - Element 3"
      ## 
      ## $`Document 2`
      ## [1] "Document 2 - Element 1"
      ## [2] "Document 2 - Element 2"
      ## [3] "Document 2 - Element 3"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-18
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 2018-11-18
        • 1970-01-01
        • 1970-01-01
        • 2014-11-04
        相关资源
        最近更新 更多