【问题标题】:Assigning observation name to a value when retrieving a variable检索变量时将观察名称分配给值
【发布时间】:2018-06-11 16:40:59
【问题描述】:

我想创建一个数据框,其中包含对约 20 个变量的 > 100 个观察值。现在,这将基于保存到我的本地文件夹中的 html 文件列表。我想确保每个变量的正确值与每个观察值匹配。假设 R 将使用相同的文件顺序来构造每个变量,并且在出现错误或类似情况时不跳过变量,这应该会自动发生。 但是,是否有“保存方式”,这意味着在检索信息时将观察名称分配给每个变量值?

以我的示例代码来提取变量以使其更清晰:

#Specifying the url for desired website to be scrapped
url <- 'http://www.imdb.com/search/title? 
count=100&release_date=2016,2016&title_type=feature'

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

title_data_html <- html_text(html_nodes(webpage,'.lister-item-header a'))
rank_data_html <- html_text(html_nodes(webpage,'.text-primary'))
description_data_html <- html_text(html_nodes(webpage,'.ratings-bar+ .text- 
muted'))

df <- data.frame(title_data_html, rank_data_html,description_data_html)

这将提供一个排名和描述数据列表,但不引用排名或描述的观察名称(在将其绑定到 df 之前)。现在,在我的实际代码中,一个变量突然出现了太多的 1 值,所以有 201 条描述,但只有 200 部电影。如果没有提及描述属于哪部电影,那么很容易看出为什么会发生这种情况。

一位同事建议一次提取 1 个观察的所有变量,并逐行扩展数据框(一次 1 个观察),而不是逐列扩展(一次 1 个变量),但发现错误并清理以这种方式增加每个变量的需求似乎更耗时。

在这种情况下,有没有人建议什么是“最佳实践”?

谢谢!

【问题讨论】:

  • 这是一个令人困惑的问题。 “我想确保每个变量的正确值与每个观察值匹配。”是什么意思?如果您包含reproducible example,可能更容易弄清楚您想要什么。顺便说一句,您的示例代码不会做您认为它会做的事情。 for (i in &lt;integer vector of length one&gt;) &lt;do something&gt; 将执行一次循环,i 只有一个值。
  • @DanHall:我已经更新了我的描述,希望现在更清楚

标签: r dataframe web-scraping


【解决方案1】:

我知道这不是一个令人满意的答案,但没有解决此类问题的单一策略。这是网络抓取的工作。无法保证 html 将按照您期望的方式进行结构化。

您没有向我们展示可重现的示例(我们可以在我们自己的机器上运行该示例来重现您遇到的问题),因此我们无法帮助您解决为什么您在一次调用中最终提取了 201 个节点html_nodes 当您期望 200 时。这里的最佳实践是无聊的旧建议,即查看您正在抓取的网站,查看您的数据,并查看额外或重复的描述在哪里(或丢失的电影在哪里)。也许有一个奇怪的元素,它的属性也与您的 xpath 选择器文本匹配。查看在浏览器中显示的网站以及来源。右键单击、CTL + U (PC) 或 OPT + CTL + U (Mac) 是提取源代码的一些方法。使用搜索功能查看与选择器文本匹配的内容。

如果您使用的 html 文档与您使用的示例类似,您将无法使用您正在寻求帮助的策略(提取电影名称和描述)。您已经在提取名称。名称与描述不在同一元素中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    相关资源
    最近更新 更多