вернуть несоответствия формата с помощью download.file () против xml2 :: read_ html () - PullRequest
0 голосов
/ 26 февраля 2020

Я пытаюсь проанализировать страницу индекса FTP-сайта, чтобы получить список файлов на основе содержимого тегов <a href = "">. Я изо всех сил пытаюсь понять, почему я получаю разные форматы в результате при попытке загрузить индекс папки FTP по-разному (результаты имеют разные спецификации DOCTYPE). Рассмотрим следующее:

  tf = tempfile()
  download.file("ftp://ftp.dfg.ca.gov/IEP_Zooplankton/", tf)
  file.show(tf)

Результат:

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">



FTP directory /IEP_Zooplankton/ at ftp.dfg.ca.gov


FTP directory /IEP_Zooplankton/ at ftp.dfg.ca.gov

Up to higher level directory
09/06/2019 01:26PM Directory . 09/06/2019 01:26PM Directory .. 07/09/2019 12:00AM 11,393,654 1972-2018CBMatrix.xlsx 05/09/2019 12:00AM 3,174,362 1972-2018MysidMatrix.xlsx 05/09/2019 12:00AM 6,058,037 1972-2018Pump Matrix.xlsx 05/09/2019 12:00AM 16,238 ReadMeZooplanktonStudyMatricesMay2019.docx 09/06/2019 01:26PM 1,737,932 ZooplanktonMetadataSept2019.pdf 05/01/2008 12:00AM 202,752 ZP Monitoring Station Map Historic.ppt 10/31/2017 12:00AM 199,023 ZPCoreAndCurrentStationsAug2017.pdf

Однако, если я попытаюсь выполнить эквивалентное действие с xml2::read_html() (или curl::curl_fetch_memory()) Я получаю совершенно другой формат:

xml = xml2::read_html("ftp://ftp.dfg.ca.gov/IEP_Zooplankton/")

Результат (вы можете распечатать все содержимое страницы на консоли, выполнив as.character(xml)):

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body><p>drwxrwxrwx   1 user     group           0 Sep  6 13:26 .
drwxrwxrwx   1 user     group           0 Sep  6 13:26 ..
-rw-rw-rw-   1 user     group    11393654 Jul  9  2019 1972-2018CBMatrix.xlsx
-rw-rw-rw-   1 user     group     3174362 May  9  2019 1972-2018MysidMatrix.xlsx
-rw-rw-rw-   1 user     group     6058037 May  9  2019 1972-2018Pump Matrix.xlsx
-rw-rw-rw-   1 user     group       16238 May  9  2019 ReadMeZooplanktonStudyMatricesMay2019.docx
-rw-rw-rw-   1 user     group     1737932 Sep  6 13:26 ZooplanktonMetadataSept2019.pdf
-rw-rw-rw-   1 user     group      202752 May  1  2008 ZP Monitoring Station Map Historic.ppt
-rw-rw-rw-   1 user     group      199023 Oct 31  2017 ZPCoreAndCurrentStationsAug2017.pdf
</p></body></html>

Первый результат (через download.file()) анализируется с помощью функций xml2::xml_find_*(), но последний - нет. Почему я получаю разные форматы для одного и того же файла? Как я могу убедиться, что я получаю прежний формат (т. Е. С тегами <a>)?

Ответы [ 2 ]

0 голосов
/ 26 февраля 2020

Хотя это не объясняет , почему формат страницы индекса FTP, загруженной с download.file(), отличается от формата, загруженного с помощью curl::curl_download(), я нашел эту суть , которая обеспечивает альтернативное решение, использующее curl для выполнения sh исходной задачи: получить список файлов в каталоге FTP.

library(curl)

con = curl(url = url, "r", handle = new_handle(dirlistonly = TRUE))
files = readLines(con)
close(con)
print(files)

[1] "1972-2018CBMatrix.xlsx"
[2] "1972-2018MysidMatrix.xlsx"
[3] "1972-2018Pump Matrix.xlsx"
[4] "ReadMeZooplanktonStudyMatricesMay2019.docx" [5] "ZooplanktonMetadataSept2019.pdf"
6 "История станции мониторинга ZP c .ppt"
[7] "ZPCoreAndCurrentStationsAug2017.pdf"

0 голосов
/ 26 февраля 2020

Я обнаружил, что ваша FTP-ссылка истекла, поэтому я не могу дать вам воспроизводимый пример, но я думаю, что если вы это сделаете:

xml <- xml2::read_html("ftp://ftp.dfg.ca.gov/IEP_Zooplankton/")
link_nodes <- xml2::xml_find_all(xml, xpath = "//a") 
xml2::xml_attr(link_nodes, "href")

Вы должны получить вектор всех ссылок на странице тебе нужно.

...