【问题标题】:Using R pagedown package to extract webpages as PDFs without pop-ups and cookie warnings使用 R pagedown 包将网页提取为 PDF,没有弹出窗口和 cookie 警告
【发布时间】:2020-11-16 09:13:12
【问题描述】:

所以我的一个朋友在一个美食博客上写了 800 多篇文章,我希望将所有这些文章提取为 PDF,以便我可以将它们很好地装订并送给他。手动使用 Chrome 的“另存为 PDF”的文章太多了,所以我正在寻找最清晰的方法来运行以这种格式保存网站的循环。我有一个可行的解决方案,但是,最终的 PDF 在每一页上都有丑陋的广告和 cookie 警告横幅。当我在 Chrome 上手动选择“打印”为 PDF 时,我没有看到这一点。有没有办法使用 pagedown 将设置传递给 Chromium 以使其在没有这些元素的情况下打印?我在下面粘贴了我的代码,以及有问题的网站。

library(rvest)
library(dplyr)
library(tidyr)
library(stringr)
library(purrr)
library(downloader)

#Specifying the url for desired website to be scraped

url1 <- paste0('https://www.foodrepublic.com/author/george-embiricos/page/', '1', '/')

#Reading the HTML code from the website
webpage1 <- read_html(url1)

# Pull the links for all articles on George's initial author page

dat <- html_attr(html_nodes(webpage1, 'a'), "href") %>%
  as_tibble() %>%
  filter(str_detect(value, "([0-9]{4})")) %>%
  unique() %>%
  rename(link=value)

# Pull the links for all articles on George's 2nd-89th author page

for (i in 2:89) {

url <- paste0('https://www.foodrepublic.com/author/george-embiricos/page/', i, '/')

#Reading the HTML code from the website
webpage <- read_html(url)

links <- html_attr(html_nodes(webpage, 'a'), "href") %>%
  as_tibble() %>%
  filter(str_detect(value, "([0-9]{4})")) %>%
  unique() %>%
  rename(link=value)

dat <- bind_rows(dat, links) %>%
  unique()

}

dat <- dat %>%
  arrange(link)

# form 1-link vector to test with

tocollect<- dat$link[1]

pagedown::chrome_print(input=tocollect,
                       wait=20,
                       format = "pdf",
                       verbose = 0,
                       timeout=300)

【问题讨论】:

    标签: html r pdf pagedown


    【解决方案1】:

    我宁愿去掉页面上所有不需要的元素(尤其是脚本,而你想保留样式表),保存为临时 HTML,然后打印出来。编写的 HTML 文件在浏览器中看起来不错,但我无法测试打印:

    for(l in articleUrls) {
      a <- read_html(l) 
      xml_remove(a %>% xml_find_all("aside"))
      xml_remove(a %>% xml_find_all("footer"))
      xml_remove(a %>% xml_find_all(xpath = "//*[contains(@class, 'article-related mb20')]"))
      xml_remove(a %>% xml_find_all(xpath = "//*[contains(@class, 'tags')]"))
      xml_remove(a %>% xml2::xml_find_all("//script"))
      xml_remove(a %>% xml_find_all("//*[contains(@class, 'ad box')]"))
      xml_remove(a %>% xml_find_all("//*[contains(@class, 'newsletter-signup')]"))
      xml_remove(a %>% xml_find_all("//*[contains(@class, 'article-footer')]"))
      xml_remove(a %>% xml_find_all("//*[contains(@class, 'article-footer-sidebar')]"))
      xml_remove(a %>% xml_find_all("//*[contains(@class, 'site-footer')]"))
      xml_remove(a %>% xml_find_all("//*[contains(@class, 'sticky-newsletter')]"))
      xml_remove(a %>% xml_find_all("//*[contains(@class, 'site-header')]"))
      
      xml2::write_html(a, file = "currentArticle.html")
      
      pagedown::chrome_print(input = "currentArticle.html")
    }
    

    【讨论】:

    • 这很有帮助。它可以让我在本地获得漂亮的 HTML。但是,我刚刚意识到您说您没有测试打印,这给了我一个错误: 强制错误(expr):无法生成输出。原因:无法导航到无效的 URL
    • 开个玩笑,我能够将它从 HTML 转换为 PDF!它看起来几乎和浏览器一样好。但是,有一个 Facebook 喜欢/分享按钮和一个“获取最新消息!”标记在每个页面的底部页脚。我将如何检查 HTML 并找到我可能想要删除的元素?再次感谢。
    • 最后,有没有一种方法可以从 HTML 或 URL 的最后部分获取标题,并将其作为 HTML 文件名?
    • 在浏览器中右键单击元素,单击“检查元素”并查找元素的标签、类或ID,并以相同的方式将其添加到我的列表中。是的,你可以,你想保留所有 800 个 HTML 文件吗?只需使用gsub提取最后一个/之后的部分并使用paste0(filename, ".html")创建文件名
    • 太棒了。当我在按钮上执行此操作时,它会突出显示:==$0。我是否只是复制您的一行并将“site-header”替换为“_8f1i”?
    猜你喜欢
    • 2011-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多