Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取html(url)和读取html(内容(获取(url),“文本”)之间的差异_R_Get_Rvest_Xml2 - Fatal编程技术网

读取html(url)和读取html(内容(获取(url),“文本”)之间的差异

读取html(url)和读取html(内容(获取(url),“文本”)之间的差异,r,get,rvest,xml2,R,Get,Rvest,Xml2,我看到了这个伟大的答案: 解决方案的开头包括: library(httr) library(xml2) gr <- GET("https://nzffdms.niwa.co.nz/search") doc <- read_html(content(gr, "text")) xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value") 到目前为止,我的默认方式是: doc <- r

我看到了这个伟大的答案:

解决方案的开头包括:

library(httr)
library(xml2)

gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(content(gr, "text"))

xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
到目前为止,我的默认方式是:

doc <- read_html("https://nzffdms.niwa.co.nz/search")
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
但这导致了这个问题:

想法:

  • 我看不到get请求包含任何头或cookie,这 可以解释不同的反应

  • 据我所知,
    read_html
    read_html(content(GET(.)),
    “text”)
    将返回XML/html

  • 好的,在这里我不确定检查是否有意义,但是因为我没有主意了:我检查了是否有某种缓存正在进行

代码:

与_verbose(GET(“https://nzffdms.niwa.co.nz/search"))
....

不同之处在于,对于重复调用
httr::GET
,句柄在调用之间保持不变。使用
xml2::read_html()
,每次都会建立一个新连接

从httr文档中:

句柄池用于自动重用相同方案/主机/端口组合的Curl句柄。这确保了http会话被自动重用,并且在对站点的请求之间维护cookie,而无需用户干预

在xml2文档中,讨论传递给
read\u html()
的字符串参数:

字符串可以是路径、url或文本xml。url将使用
base::url
或安装
curl::curl

所以你的答案是
read\u html(GET(url))
就像刷新你的浏览器,但是
read\u html(url)
就像关闭你的浏览器并打开一个新的浏览器。服务器在其交付的页面上提供唯一的会话ID。新会话,新ID。您可以通过调用
httr::reset\u handle(url)
来证明这一点:


哇…由于代理(我已经设置了
配置
),我得到了
读取html(“http://httpbin.org/“”
但不适用于
读取html(获取http://httpbin.org/)
…看起来像个bug…回到你的qn,我不是100%确定,但您的最后一个想法似乎是合理的,可能在第一个选项中设置了保持连接活动,但在第二个选项中没有设置。同样,如果read_html使用curl(如果已安装),那么(理论上)应该可以配置read_html,就像在httr curl处理中一样,它也重用curl句柄,对吗?
doc <- read_html("https://nzffdms.niwa.co.nz/search")
xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value")
read_html
(ms <- methods("read_html"))
getAnywhere(ms[1])
xml2:::read_html
xml2:::read_html.default
#xml2:::read_html.response

read_xml
(ms <- methods("read_xml"))
getAnywhere(ms[1])
with_verbose(GET("https://nzffdms.niwa.co.nz/search"))
....
<- Expires: Thu, 19 Nov 1981 08:52:00 GMT
<- Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
library(httr)
library(xml2)

# GET the page (note xml2 handles httr responses directly, don't need content("text"))
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(gr)
print(xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value"))

# A new GET using the same handle gets exactly the same response
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(gr)
print(xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value"))

# Now call GET again after resetting the handle
httr::handle_reset("https://nzffdms.niwa.co.nz/search")
gr <- GET("https://nzffdms.niwa.co.nz/search")
doc <- read_html(gr)
print(xml_attr(xml_find_all(doc, ".//input[@name='search[_csrf_token]']"), "value"))
[1] "ecd9be7c75559364a2a5568049c0313f"
[1] "ecd9be7c75559364a2a5568049c0313f"
[1] "d953ce7acc985adbf25eceb89841c713"