如何用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
相关产品推荐
相关产品推荐

