You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

用R爬取维基百科印尼电影信息框:如何确定分隔符?

问题:R爬取维基百科印尼电影信息框演员字段仅提取到单行数据

问题背景

尝试爬取维基百科印尼电影《Kutunggu di Sudut Semanggi》的信息框数据,其中「Pemeran(演员)」字段为多行结构,对应HTML代码如下:

<tr>
  <th scope="row" class="infobox-label" style="white-space:nowrap;padding-right:0.65em;">Pemeran</th>
  <td class="infobox-data">
    <a href="/w/index.php?title=Marisa_Tompunu&amp;action=edit&amp;redlink=1" class="new" title="Marisa Tompunu (halaman belum tersedia)">Marisa Tompunu</a><br>
    <a href="/wiki/Berliana_Febrianti" class="mw-redirect" title="Berliana Febrianti">Berliana Febrianti</a><br>
    <a href="/w/index.php?title=Hanna_Wijaya&amp;action=edit&amp;redlink=1" class="new" title="Hanna Wijaya (halaman belum tersedia)">Hanna Wijaya</a><br>
    <a href="/wiki/Slamet_Rahardjo" title="Slamet Rahardjo">Slamet Rahardjo</a><br>
    <a href="/w/index.php?title=Dwi_Asih_Setiawati&amp;action=edit&amp;redlink=1" class="new" title="Dwi Asih Setiawati (halaman belum tersedia)">Dwi Asih Setiawati</a><br>
    <a href="/wiki/Tengku_Firmansyah" title="Tengku Firmansyah">Tengku Firmansyah</a>
  </td>
</tr>

编写的原R代码:

# Scrape the Wikipedia page for the film
url <- "https://id.wikipedia.org/wiki/Kutunggu_di_Sudut_Semanggi"
page <- read_html(url)

# Extract the infobox
infobox <- html_nodes(page, "table.infobox")

# Extract the "Pemeran" field from the infobox
anchors <- html_nodes(infobox, "th:contains('Pemeran') + td")

# Extract the names of the cast members from the anchor elements
pemeran <- html_text(html_nodes(anchors, "a"))

# Split the text into separate lines
lines <- strsplit(pemeran, "<br>")[[1]]

# Create a new row for each line
rows <- data.frame(Pemeran = lines)

# Check the rows
print(rows)

运行后仅得到单行结果:

Pemeran
1 Marisa Tompunu

预期结果为包含6位演员的多行数据框:

Pemeran
1 Marisa Tompunu
2 Berliana Febrianti
3 Hanna Wijaya
4 Slamet Rahadrjo
5 Dwi Asih Setiawati
6 Tengku Firmansyah

错误原因

  1. <br>标签处理错误:<br>是HTML换行标签,当用html_text()提取<a>标签文本时,该标签已被解析,不会出现在提取结果中,因此用<br>作为分隔符拆分完全无效。
  2. 向量操作误解:html_text(html_nodes(anchors, "a"))返回的是多元素字符向量(每个元素对应一位演员名字),但原代码用strsplit处理时,仅会对向量的第一个元素进行拆分,导致仅保留第一位演员。

修正后的代码

# 爬取目标维基百科页面
url <- "https://id.wikipedia.org/wiki/Kutunggu_di_Sudut_Semanggi"
page <- read_html(url)

# 定位页面中的信息框
infobox <- html_nodes(page, "table.infobox")

# 直接提取Pemeran字段下所有演员链接的文本
pemeran <- html_nodes(infobox, "th:contains('Pemeran') + td a") %>% html_text()

# 将字符向量转换为多行数据框
rows <- data.frame(Pemeran = pemeran)

# 输出结果
print(rows)

关键修正点

  • 用CSS选择器th:contains('Pemeran') + td a直接定位所有演员的链接标签,一步提取所有演员名字,无需额外拆分操作。
  • 利用html_text()返回的字符向量直接生成数据框,每个向量元素对应数据框的一行。

内容的提问来源于stack exchange,提问作者Prahara

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 05:25:44