读取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
将返回XML/htmlread_html(content(GET(.)), “text”)
- 好的,在这里我不确定检查是否有意义,但是因为我没有主意了:我检查了是否有某种缓存正在进行
与_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"