Как мне извлечь тег из div с помощью rvest?

#html #r #xpath #web-scraping #rvest

#HTML #r #xpath #очистка веб-страниц #rvest

Вопрос:

У меня есть этот html:

 <div class="monty">album: <b>And Now For Something Completely Different</b> (1998)</div>
 

В настоящее время я использую этот xpath, чтобы найти его:

     for_monty <- rvest::html_node(for_html_code, xpath = "/html/body/div[2]/div/div[2]/div[11]/div[1]/b")
 

Но не все страницы имеют этот номер div, поэтому иногда он ничего не очищает. Единственным постоянным классом является monty , и я хотел бы извлечь только <b> тег из этого div.

Ответ №1:

Звучит так, как будто ваш xpath должен быть //div[@class='monty']/b

Мы можем попробовать это как полное повторение в вашем собственном фрагменте:

 library(rvest)
#> Loading required package: xml2

html <- "<div class="monty">album: <b>And Now For Something Completely Different</b> (1998)</div>"

read_html(html) %>% 
  html_nodes(xpath = "//div[@class='monty']/b")
#> {xml_nodeset (1)}
#> [1] <b>And Now For Something Completely Different</b>
 

Создано 2020-12-14 пакетом reprex (версия 0.3.0)

Комментарии:

1. О, вау, большое вам спасибо! Это работает отлично. Есть ли где-нибудь, где я могу прочитать больше о таких путях и о том, как их создавать? Я не мог найти, как это написать, поэтому мне пришлось спросить здесь. Или люди обычно используют какое-то расширение Chrome (или что-то в этом роде) для их создания?

2. @Aman нет, я считаю, что использование расширений Chrome или Firefox, которые предоставляют вам xpath, как правило, использует индексацию, что делает их гораздо более уязвимыми для незначительных изменений в структуре html. Вы можете ознакомиться с xpath здесь , и здесь есть много отличных вопросов и ответов на Stack Overflow для более сложных вещей.