2

我正在使用 Python Mechanize 打开具有这种格式的 URL...

https://www.simplewebsite.com?view=discussions#/?page=2

当页面打开时......它得到这个......

https://www.simplewebsite.com?view=discussions

完全绕过“#”标记后的内容......

任何线索如何打开网址?我花了很多时间在网上搜索......没有一个肯定的答案......

4

3 回答 3

1

该网站很可能依赖其 JavaScript 来解析 URL 的其余部分(在 之后#);见window.location

除非 Mechanize 能够以某种方式运行 JavaScript,否则您将无法获得想要的结果。尝试SeleniumPhantom.JS / Phantompy或类似的东西。

该站点实际上可能支持直接传递参数,然后您可以请求

https://www.simplewebsite.com?view=discussions&page=2

如果没有,您将不得不检查它发出的 AJAX 查询以请求您实际想要的数据。

于 2013-06-26T22:55:43.783 回答
1

出现在主题标签之后的 URL 部分是对 HTML 锚点的引用,它们由客户端(通常是 Web 浏览器)处理,并且永远不会发送到服务器。

该网站可能正在加载在页面加载时运行的 Javascript 代码。该代码解析锚名称并基于该名称更新页面。在这种情况下,很明显 javascript 代码必须向服务器发送一个 ajax 请求以获取第 2 页,然后更新 HTML 文档以显示该数据。

不幸的是,mechanize 将无法处理这种类型的网站,因为它依赖于在客户端上运行 Javascript 代码。您可能可以使用 phantom.js 执行类似的操作,这是一个可以运行客户端脚本的无头 Web 浏览器客户端。

于 2013-06-26T23:01:23.500 回答
-2

您是否使用查询字符串:

view=discussions%23%2F%3Fpage%3D2

?? 例如:

import mechanize as mech
from urllib import urlencode

host = "http://localhost:8080/1.php"

data = {"view": "discussions#/?page=2"}
data = urlencode(data)
print "encoded data sent by python:\n\t", data

resp = mech.urlopen(host + "?" + data)
print resp.read()

它当然“有效”。对方是否知道如何正确解码和解析查询字符串是另一回事。例如,如果您在以下位置请求以下 php 程序http://localhost:8080/1.php

<?php

parse_str(
    urldecode($_SERVER['QUERY_STRING']),
    $data
);

//You might also call htmlentities() on the query string
//if a browser was going to display the result


echo "php received the following data:\n";

foreach($data as $key => $val)
{
    echo "\t $key ----> $val \n";
}

?>

... python 程序输出:

encoded data sent by python:
    view=discussions%23%2F%3Fpage%3D2

php received the following data:
     view ----> discussions#/?page=2 

至于这个:

When the page opens...it gets this...

    https://www.simplewebsite.com?view=discussions

Completely bypassing what's after the "#" mark...  

一个 RFC 说:

查询组件由第一个问号 ("?") 字符指示,并以数字符号 ("#") 字符或 URI 结尾终止。 https://www.rfc-editor.org/rfc/rfc3986#section-3.4

于 2013-06-26T22:46:39.890 回答