使用 for 循环从多个网页中抓取存储在无序列表中的几个链接
Scrape several links stored inside a unordered list from several webpage using a for loop
我目前正在抓取捷克共和国议会的网站。总的来说,我对作为不同委员会成员的代表的名字感兴趣。为此,我想从几个概览页面中提取 links。以下网站为例: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&o=7">
<font style="vertical-align: inherit;">
</a>
<li>
</ul>
</br>
</div>
此示例文档有两个 link 存储在无序列表中。我有超过两个 link 的文档,但一般节点结构是相同的。那些 links 我想提取并将它们存储在一个列表中,这样一个列表条目对应一个文档(所以最后有 16 个列表条目)。为了提取 links 我尝试了以下 for loop.
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 个条目(每个文档一个),但每个条目仅包含第一个 link。
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"
.
.
.
例如,第一个列表条目应包含四个 link 而不是一个。
我尝试了许多不同的 xpath 和 css 选择器变体,但我认为问题出在循环而不是 xpath。
非常感谢您!
我认为这是因为 i
的长度始终为 1。所以您确实应该看到 要替换的项目数不是替换长度的倍数 。
您可以将 return 包裹在 list()
中,例如
subcommittee_links[i] <- list(html_nodes(html_out, xpath = '/html/body/div[2]//ul//a') %>% html_attrs())
我目前正在抓取捷克共和国议会的网站。总的来说,我对作为不同委员会成员的代表的名字感兴趣。为此,我想从几个概览页面中提取 links。以下网站为例: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&o=7">
<font style="vertical-align: inherit;">
</a>
<li>
</ul>
</br>
</div>
此示例文档有两个 link 存储在无序列表中。我有超过两个 link 的文档,但一般节点结构是相同的。那些 links 我想提取并将它们存储在一个列表中,这样一个列表条目对应一个文档(所以最后有 16 个列表条目)。为了提取 links 我尝试了以下 for loop.
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 个条目(每个文档一个),但每个条目仅包含第一个 link。
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"
.
.
.
例如,第一个列表条目应包含四个 link 而不是一个。
我尝试了许多不同的 xpath 和 css 选择器变体,但我认为问题出在循环而不是 xpath。
非常感谢您!
我认为这是因为 i
的长度始终为 1。所以您确实应该看到 要替换的项目数不是替换长度的倍数 。
您可以将 return 包裹在 list()
中,例如
subcommittee_links[i] <- list(html_nodes(html_out, xpath = '/html/body/div[2]//ul//a') %>% html_attrs())