Извлечь более одного типа элементов, сохраняя порядок, используя rvest (или аналогичный) в R? - PullRequest
2 голосов
/ 19 октября 2019

Я пытаюсь извлечь элементы, соответствующие 2 разным типам, в документе HTML, сохраняя при этом порядок.

Нетрудно извлечь каждый тип элемента отдельно (см. Пример), но я не могу понять, как извлечь их оба за один раз и сохранить порядок, в котором они появляются на веб-странице.

Минимальный пример

Вот несколько фиктивных HTML

dummy_html <- "<p>hi there</p>
<p>2nd para</p>
<div>unwanted stuff</div>
<span>something new</span>
<p>3rd para</p>
<span>extra stuff</span>
<div>more unwanted stuff</div>
<p>4th para</p>"

Предположим, что мы хотим извлечь все элементы p и все элементы span (и сохранить порядок их появления)

# p elements on their own
library(rvest)
dummy_html %>% read_html %>% html_nodes("p")

{xml_nodeset (4)}
[1] <p>hi there</p>
[2] <p>2nd para</p>
[3] <p>3rd para</p>
[4] <p>4th para</p>

# span elements on their own
dummy_html %>% read_html %>% html_nodes("span")
{xml_nodeset (2)}
[1] <span>something new</span>
[2] <span>extra stuff</span>

Но как мы можем извлечь все элементы или ? т. е. все элементы p и все элементы span * вместе , поэтому желаемый результат:

{xml_nodeset (6)}
[1] <p>hi there</p>
[2] <p>2nd para</p>
[3] <span>something new</span>
[4] <p>3rd para</p>
[5] <span>extra stuff</span>
[6] <p>4th para</p>

Обратите внимание на сохранение порядка (т. е. pи span вкрапления)

То, что я пробовал до сих пор

Я пробовал очевидное dummy_html %>% read_html %>% html_nodes("span|p"), но выдает ошибку.

1 Ответ

2 голосов
/ 19 октября 2019

Вы можете сделать это с помощью синтаксиса CSS или XPath;ваш CSS просто нуждался в , вместо |:

  library(rvest)
#> Loading required package: xml2

  dummy_html <- "<p>hi there</p>
<p>2nd para</p>
<div>unwanted stuff</div>
<span>something new</span>
<p>3rd para</p>
<span>extra stuff</span>
<div>more unwanted stuff</div>
<p>4th para</p>"

  # With CSS
  dummy_html %>% read_html() %>% html_nodes("p,span")
#> {xml_nodeset (6)}
#> [1] <p>hi there</p>
#> [2] <p>2nd para</p>
#> [3] <span>something new</span>
#> [4] <p>3rd para</p>
#> [5] <span>extra stuff</span>
#> [6] <p>4th para</p>
  # With XPath
  dummy_html %>% read_html() %>% html_nodes(xpath = "//span | //p")
#> {xml_nodeset (6)}
#> [1] <p>hi there</p>
#> [2] <p>2nd para</p>
#> [3] <span>something new</span>
#> [4] <p>3rd para</p>
#> [5] <span>extra stuff</span>
#> [6] <p>4th para</p>

Создано в 2019-10-19 с помощью пакета Представить (v0.3.0)

Спасибо QHarr за то, что он указал (более аккуратную) опцию CSS!

...