跟踪导致“'xml_find_all'没有适用方法”错误的 HTML 页面

tracking down the html page causing "no applicable method for 'xml_find_all'" error

提问人:Will Hanley 提问时间:8/17/2022 更新时间:8/17/2022 访问量:43

问:

我有一个包含 30,000 个 html 页面的文件夹,我正在使用此 R 函数进行解析:

extract <- function(x){
  file <- read_html(x)
  filename <- x %>% gsub("~/files/index.html", "", .)
  mapscript_vector <- file %>% 
    html_nodes("#mapscript") %>% 
    html_text() %>%
    str_match_all("markers \\= \\[\n\n\t *\\[ ?\"(.+)\", \"(\\w+)\", ([[:digit:]\\.\\-]+), ([[:digit:]\\.\\-]+), \"(\\d+)\", (\\d+)")  %>% 
    extract2(1) %>% 
    extract(2:7)
  mapscript_full_vector <- c(mapscript_vector, filename)
}

result <- lapply(html_files, extract)

它在 30,000 个文件的子集上按预期工作。但我想某处有一两个坏文件,因为当我在整个集合上运行该函数时,我收到以下错误:

Error in UseMethod("xml_find_all") : 
  no applicable method for 'xml_find_all' applied to an object of class "xml_document"

我想我至少可以做三件事之一:

  • 查找导致问题的文件
  • 改进代码,使其也可以处理类“xml_document”的对象
  • 获取代码以忽略问题文件并给我一个结果

我将不胜感激任何建议。

HTML R XML 解析

评论

2赞 neilfws 8/17/2022
这个错误有点误导。类的对象可以提供给 。最有可能的问题是您的某些文件是空的。xml_documentxml2::xml_find_all
0赞 IRTFM 8/17/2022
没有办法在 magrittr-ese 中实现计数器吗?
0赞 Will Hanley 8/17/2022
谢谢@neilfws - 确实有一个空文件。问题解决了。

答:

1赞 dcsuka 8/17/2022 #1

您可以使用如下所示的文件名称来识别导致错误的文件的名称,以及它们导致的错误:tryCatch

extract <- function(x){
  tryCatch(
  {file <- read_html(x)
  filename <- x %>% gsub("~/files/index.html", "", .)
  mapscript_vector <- file %>% 
    html_nodes("#mapscript") %>% 
    html_text() %>%
    str_match_all("markers \\= \\[\n\n\t *\\[ ?\"(.+)\", \"(\\w+)\", ([[:digit:]\\.\\-]+), ([[:digit:]\\.\\-]+), \"(\\d+)\", (\\d+)")  %>% 
    extract2(1) %>% 
    extract(2:7)
  mapscript_full_vector <- c(mapscript_vector, filename)},
  error = function(e) {
    print(e)
    print(x)
  })
}

result <- lapply(html_files[1:100], extract)

这种方法将使您了解错误发生的频率,以及它是否是您的一般功能(仅使用几个空文件)的问题。我会尝试只使用 100 个文件作为编码开始,如果没有错误,我会增加。

评论

0赞 Will Hanley 8/17/2022
我从上面的评论中找到了解决方案(其中一个文件是空的),但很感激了解,这将在下次出现难以找到的错误时对我有所帮助。谢谢。tryCatch