我通常熟悉。我知道和rvest
之间的区别。但我无法解决这个问题:html_elements()
html_element()
假设我们有类似此网页上的数据。数据采用分层格式,每个标题都有不同数量的子标题。
当我尝试抓取时,我得到了 177 个标题。但是,副标题实际上有 270 个。我想将数据提取成整齐的格式。但由于向量大小不同,我无法轻松地将它们组合成 tibble。
这是我的代码以及一些关于结果的评论:
page <- read_html("https://postdocs.stanford.edu/about/department-postdoc-admins")
person_departments <- page %>%
html_elements(".item-list") %>%
html_element("h3") %>%
html_text2()
# The above code returns
person_names <- page %>%
html_elements(".item-list li") %>%
html_element("h4") %>%
html_text2()
# This one returns 270 names (some departments have more than 1 admin)
# Using the above codes, I can't get a nice table with two columns, one for the name and one for the person's department.
主要的技巧是获取
"item-list"
元素的子元素。然后就是处理成表的问题。每个部门都是一个奇数编号的列表元素,人员位于偶数编号的元素中。必须注意空缺的部门职位。创建于 2024-09-11,使用reprex v2.1.0
这里的方法略有不同,从元素开始
.item-list > ul > li
,然后您可以直接提取姓名、电话和电子邮件。如果当前元素中没有这些元素li
,您可以方便地在结果框架中获取一个NA
值(例如,对于空缺职位和仅列出电子邮件的情况)。切换
h4
到,xpath
因为它允许搜索祖先,这样您就可以获得元素列表中的h4
每个匹配。li
在某种程度上,这是一个风格偏好的问题(当然,性能也是如此),但我们也可以使用相同的构建块而无需
map()
/lapply()
迭代。html_element()
在以下上下文中使用单数可能听起来不太直观,但文档中有这一点:必须说我个人直到今天才忽略了这一点。
无论如何,我们可以通过以下方式获得与前面的例子相同的结果:
Becnhmark(注意秒与毫秒):