1

在下面,我试图获取网站http://www.searspartsdirect.com的所有超链接,但我得到的输出是,我在这里做错了什么

 <html>
<body onload="document.acsForm.submit();">

    <form name="acsForm" action="https://www.searspartsdirect.com/partsdirect/j_acegi_cas_security_check?ssonofail=true" method="post">
        <div style="display: none">

            <textarea rows=10 cols=80 name="logonPassword"></textarea>

            <textarea rows=10 cols=80 name="loginId"></textarea>

            <textarea rows=10 cols=80 name="screenName"></textarea>

            <textarea rows=10 cols=80 name="errorCode"></textarea>

        </div>
      </form>
</body>
 </html>

这是我的脚本:

  import httplib2
  import sys
  from bs4 import BeautifulSoup , SoupStrainer
  import urllib , urllib2 , cookielib , random ,datetime,time,sys


  sitename=sys.argv[1]
  http = httplib2.Http()
  status, response = http.request(sitename)
  cookiejar = cookielib.CookieJar()
  urlOpener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookiejar))
  urllib2.install_opener(urlOpener)
  request = urllib2.Request(sitename)
  url = urlOpener.open(request)
  contents = url.read()
  soup = BeautifulSoup(contents)
  for a in soup.findAll('a'):
     print a
4

1 回答 1

1

您的问题与 BeautifulSoup 无关 - 索引页面上的源使用 Javascript 重定向到另一个 URL(因此只需下载 HTML 会给您一个无聊的页面)

重定向发生的原因是:

<body onload="document.acsForm.submit();">

..提交以下表格:

<form name="acsForm"
action="https://www.searspartsdirect.com/partsdirect/j_acegi_cas_security_check?ssonofail=true" 
method="post">

如果您只是尝试抓取浏览器重定向到的页面,您会得到一个空白页面,所以我猜您需要对“操作”URL 执行 POST 请求,并可能存储它设置的 cookie。

在 POST 数据中,您可能需要包含以下字段的值:

<textarea rows=10 cols=80 name="logonPassword"></textarea>
<textarea rows=10 cols=80 name="loginId"></textarea>
<textarea rows=10 cols=80 name="screenName"></textarea>
<textarea rows=10 cols=80 name="errorCode"></textarea>

..类似于{'logonPassword': '', 'loginId': '', ...},在您的请求中被序列化并作为 POST 数据传递

然后使用 cookie,您可以发出请求http://www.searspartsdirect.com/partsdirect/index.action或类似请求,您的 BeautifulSoup 代码应该可以按预期工作..

mechanize可能会使这一切变得更简单 - 主页上的示例基本上就是您想要的

于 2012-08-01T13:52:19.800 回答