用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&action=edit&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&action=edit&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&action=edit&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
错误原因
<br>标签处理错误:<br>是HTML换行标签,当用html_text()提取<a>标签文本时,该标签已被解析,不会出现在提取结果中,因此用<br>作为分隔符拆分完全无效。- 向量操作误解:
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
相关产品推荐
相关产品推荐

