【问题标题】:Scrape several links stored inside a unordered list from several webpage using a for loop使用 for 循环从多个网页中抓取存储在无序列表中的多个链接
【发布时间】:2021-03-14 11:12:59
【问题描述】:

我目前正在从捷克共和国议会抓取该网站。一般来说,我对不同委员会成员的代表姓名感兴趣。为此,我想从几个概述页​​面中提取链接。例如以下网站:https://www.psp.cz/sqw/hp.sqw?k=508&o=7 我已经通过以下代码下载了16个这样的网站:

for (i in 1:length(subcommittee_links_2013_2017_list)) {
  if (!file.exists(paste0(folder, subcommittee_names_2013_2017[i]))) {
    download.file(subcommittee_links_2013_2017_list[i], destfile = paste0(folder, subcommittee_names_2013_2017[i]))
    Sys.sleep(runif(1, 5, 7))
  }
}

这些文档都有相同的节点结构:

<html class="no-js translated-ltr" lang="en">
<body>
  <!-- Header -->
  <div id="header">
  <!-- Header -->    
  <hr>
  <hr>
  <!-- Body -->   
  <div id="body"> 
     <div class="part-content">
       <!-- Main content -->
       <div id="main-content">
         <h1>…<h1>
         <b>…<b>
         <font style="vertical-align: inherit;"<…>/font>
         <ul>
           <li>
             ::marker
             <a href="hp.sqw?k=522&o=7">
               <font style="vertical-align: inherit;">
             </a>
           <li>
           <li>
             ::marker
             <a href="hp.sqw?k=523&amp;o=7">
               <font style="vertical-align: inherit;">
             </a>
           <li>
         </ul>
         </br>  
       </div>

此示例文档有两个链接存储在无序列表中。我的文档有两个以上的链接,但一般节点结构是相同的。我想提取这些链接并将它们存储在一个列表中,这样一个列表条目对应一个文档(最后是 16 个列表条目)。为了提取链接,我尝试了以下 for 循环

subcommittee_links <- list()
for (i in 1:length(list_files_path)) {
  html_out <- read_html(list_files_path[i], encoding="windows-1250")
  subcommittee_links[i] <- html_nodes(html_out, xpath = '/html/body/div[2]//ul//a') %>% html_attrs()
}

for 循环生成的列表确实包含 16 个条目(每个文档一个),但每个条目仅包含第一个链接。

subcommittee_links
[[1]]
               href 
"hp.sqw?k=3520&o=7" 

[[2]]
               href 
"hp.sqw?k=3620&o=7" 

[[3]]
               href 
"hp.sqw?k=3821&o=7" 
.
.
. 

例如,第一个列表条目应该包含四个链接而不是一个。

我尝试了许多不同的 xpath 和 css 选择器变体,但我认为问题在于循环而不是 xpath。

非常感谢您!

【问题讨论】:

    标签: html r for-loop web-scraping rvest


    【解决方案1】:

    我认为这是因为 i 的长度始终为 1。所以您应该真正看到 要替换的项目数不是替换长度的倍数

    您可以将退货包裹在 list() 中,例如

    subcommittee_links[i] <- list(html_nodes(html_out, xpath = '/html/body/div[2]//ul//a') %>% html_attrs())
    

    【讨论】:

    • 非常感谢!你的解决方案对我有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-08
    • 1970-01-01
    • 1970-01-01
    • 2020-09-21
    • 1970-01-01
    相关资源
    最近更新 更多