我要打开下面的页面:
http://www.google.com/search?q=dvd + player& tbm = shop& hl = en& aq = f# q =车+人+,hl = en& sa = X& ei = vbtSTqTPDKXniAKy0-iDAw& ved = 0 cc0qpwuoaa& tbs =猫:895% 2 cprice % 3 a1 % 2 cppr_min % 3 a50 % 2 cppr_max % 3 a99.99& tbm = shop& 31 =和fp = 1,车身= 851,波黑= 426,cad = b& bav = on.2 or.r_gc.r_pw。
但是当我尝试使用WebRequest
类打开它时,它从url中删除了"片段"(在这种情况下不是Uri片段),并尝试打开以下url:
http://www.google.com/search?q=dvd + player& tbm = shop& hl = en& aq = f
我怎么才能打开那个url?
我尝试编码#
字符,但这似乎不工作。
我知道URL是什么,片段是什么,以及所有这些。我要问的是,是否有一种方法可以覆盖Uri
类的功能。(采取Uri,并删除#
之后的内容并将其放置在Fragment
属性中等),这样我就可以查询该url,而不是修改后的url。
虽然在你的例子中的片段不做什么片段设计做,它仍然提供客户端数据,浏览器采取行动后,页面已经初始加载。如果您在点击链接时仔细观察,您会看到页面的标题开始为"dvd播放器"(来自原始查询字符串),但在页面从服务器加载并执行客户端脚本后,页面更改为"汽车扬声器"。
据我所知,#代表一个片段(通常是网页中的锚),并不是URL的真正一部分,它只是将浏览器带到页面的特定部分,并且仅在客户端进行处理。
换句话说,它不是URI请求的一部分。
片段标识符的功能不同于URI:也就是说,它的处理是专属客户端,没有来自服务器的参与——当然,服务器通常会提供帮助来确定MIME类型,而MIME类型确定碎片处理。
当一个代理(比如Web浏览器)从Web服务器请求资源时,代理将URI发送到Web服务器服务器,但不发送片段。相反,代理等待服务器发送资源,然后代理处理资源根据文档类型和片段值。
http://www.w3.org/TR/webarch/media-type-fragid
这是一个奇怪的,因为fragment
真的不应该被服务器解析。但是,在您的示例url中,片段最肯定正在使用(也许在谷歌JS,客户端?)
这里有一个快速的hack,通过对整个查询进行编码,似乎可以满足您的需求:
string str =
"http://www.google.com/search?q=dvd+player&tbm=shop&hl=en&aq=f#q=car+speaker+&hl=en&sa=X&ei=vbtSTqTPDKXniAKy0-iDAw&ved=0CC0QpwUoAA&tbs=cat:895%2Cprice%3A1%2Cppr_min%3A50%2Cppr_max%3A99.99&tbm=shop&tbo=&fp=1&biw=851&bih=426&cad=b&bav=on.2,or.r_gc.r_pw.";
string[] arr = str.Split( '?' );
string uriString = arr[0] + "?" + HttpUtility.UrlEncode( arr[1] );
var uri = new Uri( uriString );
var request = ( HttpWebRequest )WebRequest.Create( uri );
编辑
回想起来,fragment
是在客户端JS上使用的,而不是在服务器端。
一个更好的主意可能是理解谷歌的Url,也就是说,你的Uri应该是:
http://www.google.com/search?q=car+speaker&hl=en&tbs=cat:895,price:1,ppr_min:50&tbm=shop
该片段是客户端机制,因此在服务器上没有用处。您传递回服务器的任何数据都将在查询字符串中,所以您看到尝试传递片段的好处是什么?
如果你在客户端需要这个变量,那么你可以使用这个javascript代码
<script>
if(window.location.hash) {
console.log(window.location.hash);
window.location.hash = window.location.hash;
}
</script>