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

如何用R的rvest包提取网页抓取数据中的图片并显示?

实现R中显示含实际图片的法学院表格

我已经用R的rvest包从维基百科抓取了美国法学院的名称和图片页面链接,现在需要生成能显示实际图片的表格,当前的抓取代码如下:

library(tidyverse)
library(rvest)
###Reading in the Data
url = 
'https://en.wikipedia.org/wiki/List_of_law_schools_in_the_United_States'
school_url = 
'https://en.wikipedia.org/wiki/List_of_law_schools_in_the_United_States' 
   %>%
read_html() %>%
html_elements('.wikitable a') %>%
html_attr('href')
school_url = paste('https://en.wikipedia.org/', school_url, sep='')

top3_school_urls = head(school_url, 3)

###Web Scraper
results = list()
for (school_url in top3_school_urls) {
  message('Scraping URL: ', school_url)
  school_html = read_html(school_url) 
  School = school_html %>% 
    html_element('h1 .mw-page-title-main') %>% html_text2()
  Logo = school_html %>% html_element('.infobox-image a') %>% 
          html_attr('href')
  Logo = paste('https://en.wikipedia.org/', Logo, sep='')

  school_tibble = tibble(School, Logo)
  results[[school_url]] = school_tibble
}

d = bind_rows(results, .id = 'url')
d

解决方案

步骤1:修正Logo提取逻辑,获取实际图片URL

当前代码抓取的是维基图片页面的跳转链接,并非直接的图片文件地址。需要额外解析图片页面,提取可直接显示的图片URL:

替换原循环中的Logo提取代码为:

# 抓取图片页面链接
logo_page_url = school_html %>% html_element('.infobox-image a') %>% html_attr('href')
if (!is.na(logo_page_url)) {
  logo_page_url = paste('https://en.wikipedia.org/', logo_page_url, sep='')
  # 从图片页面提取实际图片地址
  logo_html = read_html(logo_page_url)
  Logo = logo_html %>% html_element('.mw-file-description a') %>% html_attr('href')
  Logo = paste('https:', Logo, sep='')
} else {
  Logo = NA  # 处理无Logo的院校
}

步骤2:用DT包生成带图片的交互式表格

DT包可在RStudio Viewer中直接渲染支持图片的HTML表格,先安装并加载DT:

完整可运行代码

library(tidyverse)
library(rvest)
library(DT)

# 读取法学院列表页面
url = 'https://en.wikipedia.org/wiki/List_of_law_schools_in_the_United_States'
school_url = read_html(url) %>%
  html_elements('.wikitable a') %>%
  html_attr('href') %>%
  paste('https://en.wikipedia.org/', ., sep='')

top3_school_urls = head(school_url, 3)

# 批量抓取院校名称与实际Logo地址
results = list()
for (school_url in top3_school_urls) {
  message('Scraping URL: ', school_url)
  school_html = read_html(school_url) 
  School = school_html %>% 
    html_element('h1 .mw-page-title-main') %>% html_text2()
  
  # 提取实际图片URL
  logo_page_url = school_html %>% html_element('.infobox-image a') %>% html_attr('href')
  if (!is.na(logo_page_url)) {
    logo_page_url = paste('https://en.wikipedia.org/', logo_page_url, sep='')
    logo_html = read_html(logo_page_url)
    Logo = logo_html %>% html_element('.mw-file-description a') %>% html_attr('href')
    Logo = paste('https:', Logo, sep='')
  } else {
    Logo = NA
  }

  school_tibble = tibble(School, Logo)
  results[[school_url]] = school_tibble
}

d = bind_rows(results, .id = 'url')

# 将Logo链接转为HTML图片标签,自定义显示尺寸
d$Logo = ifelse(!is.na(d$Logo), 
                paste0('<img src="', d$Logo, '" width="80" height="80">'), 
                '无Logo')

# 生成交互式表格,关闭HTML转义以渲染图片
datatable(d, escape = FALSE, options = list(pageLength = 10))

步骤3:(可选)生成静态HTML文件分享表格

若需要分享表格,可使用htmltools包生成静态HTML文件:

library(htmltools)

# 构建HTML表格结构
html_table = tags$table(
  tags$thead(tags$tr(tags$th('院校名称'), tags$th('Logo'))),
  tags$tbody(
    pmap(d[, c('School', 'Logo')], function(School, Logo) {
      tags$tr(
        tags$td(School),
        tags$td(HTML(Logo))
      )
    })
  )
)

# 保存为本地HTML文件
save_html(html_table, '美国法学院Logo表格.html')

注意事项

  • 部分院校可能无官方Logo,代码中已处理为显示“无Logo”
  • 可调整img标签的width/height参数修改图片显示大小
  • 使用维基百科图片时需遵守其版权规定

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 05:07:15