beautifulsoup从网站获取所有网址

时间:2012-08-01 13:08:14

标签: python beautifulsoup

在下面我试图获取网站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

1 个答案:

答案 0 :(得分: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可能会让这一切变得更简单 - 主页上的示例基本上就是您想要的