网页数据抓取:从HTML到R的数据提取
立即解锁
发布时间: 2025-09-04 00:55:29 阅读量: 8 订阅数: 12 AIGC 

### 网页数据抓取:从HTML到R的数据提取
在网页数据抓取过程中,当我们将HTML数据获取到R环境后,接下来的关键步骤就是提取我们感兴趣的数据。本文将详细介绍如何利用CSS选择器和 `rvest` 包中的函数来完成这一任务,并通过实际案例进行演示。
#### 1. 查找元素
CSS是定义HTML文档视觉样式的工具,其中包含一种用于选择页面元素的小型语言,即CSS选择器。它能定义定位HTML元素的模式,对于数据抓取非常有用,因为它提供了一种简洁的方式来描述我们想要提取的元素。
常用的CSS选择器有以下三种:
- `p`:选择所有 `<p>` 元素。
- `.title`:选择所有类名为 “title” 的元素。
- `#title`:选择 `id` 属性等于 “title” 的元素,由于 `id` 属性在文档中必须唯一,所以该选择器只会选择一个元素。
以下是一个简单的示例代码:
```R
html <- minimal_html("
<h1>This is a heading</h1>
<p id='first'>This is a paragraph</p>
<p class='important'>This is an important paragraph</p>
")
# 使用 html_elements() 查找匹配选择器的所有元素
html |> html_elements("p")
#> {xml_nodeset (2)}
#> [1] <p id="first">This is a paragraph</p>
#> [2] <p class="important">This is an important paragraph</p>
html |> html_elements(".important")
#> {xml_nodeset (1)}
#> [1] <p class="important">This is an important paragraph</p>
html |> html_elements("#first")
#> {xml_nodeset (1)}
#> [1] <p id="first">This is a paragraph</p>
```
另一个重要的函数是 `html_element()`,它返回的输出数量与输入数量相同。如果将其应用于整个文档,它将返回第一个匹配的元素:
```R
html |> html_element("p")
#> {html_node}
#> <p id="first">
```
当使用不匹配任何元素的选择器时,`html_elements()` 和 `html_element()` 存在重要区别:`html_elements()` 返回长度为0的向量,而 `html_element()` 返回缺失值。
```R
html |> html_elements("b")
#> {xml_nodeset (0)}
html |> html_element("b")
#> {xml_missing}
#> <NA>
```
#### 2. 嵌套选择
在大多数情况下,我们会同时使用 `html_elements()` 和 `html_element()`。通常先使用 `html_elements()` 识别将成为观测值的元素,然后使用 `html_element()` 查找将成为变量的元素。
以下是一个简单的示例,我们有一个无序列表,每个列表项包含《星球大战》中四个角色的信息:
```R
html <- minimal_html("
<ul>
<li><b>C-3PO</b> is a <i>droid</i> that weighs <span class='weight'>167 kg</span></li>
<li><b>R4-P17</b> is a <i>droid</i></li>
<li><b>R2-D2</b> is a <i>droid</i> that weighs <span class='weight'>96 kg</span></li>
<li><b>Yoda</b> weighs <span class='weight'>66 kg</span></li>
</ul>
")
# 使用 html_elements() 创建一个向量,每个元素对应一个不同的角色
characters <- html |> html_elements("li")
characters
#> {xml_nodeset (4)}
#> [1] <li>\n<b>C-3PO</b> is a <i>droid</i> that weighs <span class="weight"> ...
#> [2] <li>\n<b>R4-P17</b> is a <i>droid</i>\n</li>
#> [3] <li>\n<b>R2-D2</b> is a <i>droid</i> that weighs <span class="weight"> ...
#> [4] <li>\n<b>Yoda</b> weighs <span class="weight">66 kg</span>\n</li>
# 提取每个角色的名字
characters |> html_element("b")
#> {xml_nodeset (4)}
#> [1] <b>C-3PO</b>
#> [2] <b>R4-P17</b>
#> [3] <b>R2-D2</b>
#> [4] <b>Yoda</b>
# 提取每个角色的体重
characters |> html_element(".weight")
#> {xml_nodeset (4)}
#> [1] <span class="weight">167 kg</span>
#> [2] <NA>
#> [3] <span class="weight">96 kg</span>
#> [4] <span class="weight">66 kg</span>
# 使用 html_elements() 查找所有体重元素
characters |> html_elements(".weight")
#> {xml_nodeset (3)}
#> [1] <span class="weight">167 kg</span>
#> [2] <span class="weight">96 kg</span>
#> [3] <span class="weight">66 kg</span>
```
从上述代码可以看出,对于名字的提取,`html_element()` 和 `html_elements()` 的区别并不重要,但对于体重的提取,`html_element()` 能确保为每个角色获取一个体重值,即使该角色没有体重信息。
#### 3. 提取数据
当我们选择了感兴趣的元素后,需要从文本内容或某些属性中提取数据。
##### 3.1 文本提取
`html_text2()` 函数用于提取HTML元素的纯文本内容:
```R
characters |>
html_element("b") |>
html_text2()
#> [1] "C-3PO" "R4-P17" "R2-D2" "Yoda"
characters |>
html_element(".weight") |>
html_text2()
#> [1] "167 kg" NA "96 kg" "66 kg"
```
需要注意的是,任何转义字符都会被自动处理,我们只会在源HTML中看到HTML转义,
0
0
复制全文
相关推荐










