Как я могу извлечь несколько элементов из 1 html, используя RCrawler's ExtractXpathPat? - PullRequest
0 голосов
/ 03 марта 2020

Я пытаюсь получить как метку, так и данные предметов музейной коллекции с помощью Rcrawler. Я думаю, что допустил ошибку, используя переменную ExtractXpathPat, но я не могу понять, как это исправить.

Я ожидаю вывод, подобный этому:

1;"Titel(s)";"De StaalmeestersDe waardijns van het Amsterdamse lakenbereidersgilde, bekend als ‘De Staalmeesters’"
1;"Objecttype";"Schilderij"
1;"Objectnummer";"SK-A-2931"

Однако вывод Файл повторяет заголовок в 3-й позиции:

1;"Titel(s)";"De StaalmeestersDe waardijns van het Amsterdamse lakenbereidersgilde, bekend als ‘De Staalmeesters’"
1;"Objecttype";"De StaalmeestersDe waardijns van het Amsterdamse lakenbereidersgilde, bekend als ‘De Staalmeesters’"
1;"Objectnummer";"De StaalmeestersDe waardijns van het Amsterdamse lakenbereidersgilde, bekend als ‘De Staalmeesters’"

HTML выглядит так:

<div class="item">
      <h3 class="item-label h4-like">Objectnummer</h3>
      <p class="item-data">SK-A-2931</p>
</div>

Мой метод выглядит так:

Rcrawler(Website = "https://www.rijksmuseum.nl/nl/", 
         no_cores = 4, no_conn = 4,
         dataUrlfilter = '.*/collectie/.*',
         ExtractXpathPat = c('//*[@class="item-label h4-like"]', '//*[@class="item-data"]'), 
         PatternsNames = c('label','data'),
         ManyPerPattern = TRUE)

Уточнение цели Страница HTML не всегда имеет одинаковые метки, а иногда и метки без соответствующих данных. Иногда данные находятся в абзаце, а иногда в неупорядоченном списке.

Моя конечная цель - создать CSV, в котором есть все метки сайта с соответствующими данными в каждой строке.

Этот вопрос состоит в том, чтобы перейти к первому этапу сбора меток и данные, которые я затем буду использовать для создания вышеупомянутого csv.

1 Ответ

1 голос
/ 03 марта 2020

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

Rcrawler(Website = "https://www.rijksmuseum.nl/nl/", 
         no_cores = 4, no_conn = 4,
         dataUrlfilter = '.*/collectie/.*',
         ExtractXpathPat = c("//h3[@class='item-label h4-like'][.='Titel(s)']/following-sibling::p/text()","//h3[@class='item-label h4-like'][.='Objecttype']/following::a[1]/text()","//h3[@class='item-label h4-like'][.='Objectnummer']/following-sibling::p/text()"), 
         PatternsNames = c("Titel(s)", "Objecttype","Objectnummer"),
         ManyPerPattern = TRUE)

Я запускаю его в течение нескольких минут, и кажется, что оно работает:

DATA[[1]]
$`PageID`
[1] 1

$`Titel(s)`
[1] "De Staalmeesters"                                                                   
[2] "De waardijns van het Amsterdamse lakenbereidersgilde, bekend als ‘De Staalmeesters’"

$Objecttype
[1] "schilderij"

$Objectnummer
[1] "SK-C-6"

Дополнительные параметры:

Bruteforce. Поскольку вы еще не знаете всех имен меток, и если вы не хотите писать конкретные c XPath, вы можете попробовать что-то подобное в RCrawlers ExtractXpathPat:

c("string((//h3[@class='item-label h4-like'])[1]/parent::*)","string((//h3[@class='item-label h4-like'])[2]/parent::*)",...,"string((//h3[@class='item-label h4-like'])[30]/parent::*)")

Здесь мы просто увеличиваем из положения 1 в положение 30. Вы можете попробовать 40,50, это зависит от вас.

PatternsNames = c ("Item1", "Item2", ..., "Item30")

Пример результата:

Item1:Title(s) The Seven Works of MercyPolyptych with the Seven Works of Charity 
Item2:Object type painting 
Item3:Object number SK-A-2815
...
Item17:Parts The Seven Works of Mercy (SK-A-2815-1) The Seven Works of Mercy (SK-A-2815-2) The Seven Works of Mercy (SK-A-2815-3) The Seven Works of Mercy (SK-A-2815-4) The Seven Works of Mercy (SK-A-2815-5) The Seven Works of Mercy (SK-A-2815-6) The Seven Works of Mercy (SK-A-2815-7)
...
Item29:
Item30:

Затем необходимо привести в порядок данные (разбить, обрезать, реорганизовать ...) с помощью соответствующих инструментов (dplyr, stringr) для создания правильного csv.

Если эта опция не работает, вы можете определить все имена меток, которые у вас могут быть (получить все //h3[@class='item-label h4-like']/text() веб-страниц и удалить дубликаты, чтобы сохранить только уникальные значения. Затем написать Xpath соответственно. Таким образом, .csv будет проще генерировать.

Вы также можете работать вне RCrawler (с другими инструментами) и писать некоторые функции для правильной очистки данных (с применением функций или для циклов).

...