使用for循环从多个网页中抓取存储在无序列表中的多个链接



我目前正在从捷克共和国议会抓取网站。总的来说,我对不同委员会的代表的名字很感兴趣。为此,我想从几个概述页面中提取链接。以下网站就是一个例子: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个列表条目(。为了提取链接,我尝试了以下循环

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。

提前非常感谢!

我认为这是因为i总是长度1。所以你真的应该看到要替换的项目数量不是替换长度的倍数

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

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

最新更新