3

是否可以让 mechanize 跟随 javascript 类型的锚链接?

我正在尝试使用 mechanize 和 beautifulsoup 登录 python 中的网站。

这是锚链接

<a id="StaticModuleID15_ctl00_SkinLogin1_Login1_Login1_LoginButton" href="javascript:WebForm_DoPostBackWithOptions(new WebForm_PostBackOptions(&quot;StaticModuleID15$ctl00$SkinLogin1$Login1$Login1$LoginButton&quot;, &quot;&quot;, true, &quot;Login1&quot;, &quot;&quot;, false, true))"><img id="StaticModuleID15_ctl00_SkinLogin1_Login1_Login1_Image2" border="0" src="../../App_Themes/default/images/Member/btn_loginenter.gif" align="absmiddle" style="border-width:0px;" /></a>

这是我尝试过的

    links = SoupStrainer('a', id="StaticModuleID15_ctl00_SkinLogin1_Login1_Login1_LoginButton")
    [anchor for anchor in BeautifulSoup(data, parseOnlyThese=links)]
    link = mechanize.Link( base_url = self.url,
                    url = str(anchor['href']),
                    text = str(anchor.string),
                    tag = str(anchor.name),
                    attrs = [(str(name), str(value))
                             for name, value in anchor.attrs])
    response2 = br.follow_link(link)

现在我收到错误消息,

urllib2.URL错误:

任何帮助或建议表示赞赏

编辑

帮手评论后,我去查看了一下asp页面的代码。

我发现了一些有用的脚本,但我不确定我必须在 python 中做什么才能用 python 模拟 JS 代码。我在哪里没有看到任何 cookie 设置,我看错地方了吗?

<form name="form1" method="post" action="BrowseSchedule.aspx?ItemId=75" onsubmit="javascript:return WebForm_OnSubmit();" id="form1">

//<![CDATA[
function WebForm_OnSubmit() {
if (typeof(ValidatorOnSubmit) == "function" && ValidatorOnSubmit() == false) return false;
return true;
}
//]]>

<script type="text/javascript">
//<![CDATA[
var theForm = document.forms['form1'];
if (!theForm) {
    theForm = document.form1;
}
function __doPostBack(eventTarget, eventArgument) {
    if (!theForm.onsubmit || (theForm.onsubmit() != false)) {
        theForm.__EVENTTARGET.value = eventTarget;
        theForm.__EVENTARGUMENT.value = eventArgument;
        theForm.submit();
    }
}
//]]>
</script>
function WebForm_DoPostBackWithOptions(options) {
    var validationResult = true;
    if (options.validation) {
        if (typeof(Page_ClientValidate) == 'function') {
            validationResult = Page_ClientValidate(options.validationGroup);
        }
    }
    if (validationResult) {
        if ((typeof(options.actionUrl) != "undefined") && (options.actionUrl != null) && (options.actionUrl.length > 0)) {
            theForm.action = options.actionUrl;
        }
        if (options.trackFocus) {
            var lastFocus = theForm.elements["__LASTFOCUS"];
            if ((typeof(lastFocus) != "undefined") && (lastFocus != null)) {
                if (typeof(document.activeElement) == "undefined") {
                    lastFocus.value = options.eventTarget;
                }
                else {
                    var active = document.activeElement;
                    if ((typeof(active) != "undefined") && (active != null)) {
                        if ((typeof(active.id) != "undefined") && (active.id != null) && (active.id.length > 0)) {
                            lastFocus.value = active.id;
                        }
                        else if (typeof(active.name) != "undefined") {
                            lastFocus.value = active.name;
                        }
                    }
                }
            }
        }
    }
    if (options.clientSubmit) {
        __doPostBack(options.eventTarget, options.eventArgument);
    }
}
4

2 回答 2

4

我认为 mechanize 模块不可能做到这一点:它没有与 JavaScript 交互的能力:它纯粹基于 Python 和 HTTP。

也就是说,你可能会在python-spidermonkey模块中进行测试,它似乎旨在让你做这种事情。根据它的网站,它的目的是让你

“从 Python 执行任意 JavaScript 代码。允许您在 JavaScript VM 中引用任意 Python 对象和函数”

我还没有使用它,但它看起来确实可以满足您的需求,尽管它仍处于 alpha 阶段。

于 2009-08-13T06:11:01.250 回答
0

您可以使用 cookielib 设置 cookie

import mechanize
import cookielib
# add headers to your browser also
browser = mechanize.Browser()
browser.addheaders = [('User-agent', 'Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.0.1) Gecko/2008071615 Fedora/3.0.1-1.fc9 Firefox/3.0.1')]
cj = cookielib.LWPCookieJar()
browser.set_cookiejar(cj)

我怀疑这现在是否相关,但是哦,好吧:)

于 2013-03-14T17:37:38.767 回答