使用Python来抓取ReferenceUSA

时间:2018-05-07 18:27:14

标签: python web-scraping

首先我是Python的新手,请原谅这些愚蠢的问题。

我正在使用Robobrowser并使用以下代码启动浏览器。请注意,我必须首先登录该网站,然后导航到搜索结果页面(我已经硬编码):

from robobrowser import RoboBrowser 
from datetime import datetime
import re 
import csv

browser = RoboBrowser(history = True, parser = 'html.parser', user_agent='chrome')
browser.open('https://cas.columbia.edu/cas/login?service=https%3a%2f%2fwww1.columbia.edu%2fsec-cgi-bin%2fcul%2fprox%2fezpwebserv-ezproxy.cgi%3furl%3dezp.2aHR0cDovL3d3dy5yZWZlcmVuY2V1c2EuY29t')

form = browser.get_form(class_='fm-v clearfix' )
form['username'].value = '**************'
form['password'].value = '**************'
browser.submit_form(form)

url = 'http://www.referenceusa.com.ezproxy.cul.columbia.edu/UsBusiness/Result/41526a3b232941b0ae8df36a9870fec6'
browser.open(url)

我要做的是构建一个刮刀以从ReferenceUSA获取数据。我打开网站并查看HTML我看到我要编码的元素:

<a href="#" class="action-view-record" data-all-url="/UsBusiness/Detail/All/41526a3b232941b0ae8df36a9870fec6/0?recordId=366190858" data-tagged-url="/UsBusiness/Detail/Tagged/41526a3b232941b0ae8df36a9870fec6?recordId=366190858">034 Efi</a>

从这里我想得到文本,所以我尝试了:

companies = browser.find_all(class_='action-view-record')
for company in companies:
    company_name = company.text
    print(company_name)

问题在于,当我运行代码时,不会打印任何内容。我认为该页面打开正确,因为我尝试了:

links = browser.find_all('a')
for link in links:
    print(link.text)

并列出页面顶部/底部的所有导航链接(例如关于我们,联系方式等)。但是没有来自实际搜索结果的链接。

我还希望从此标记中获取链接,以便我可以按照页面进入详细信息。在这里,我还有一个问题,那就是HREF ='#'。那么我该如何获得链接?

谢谢!

1 个答案:

答案 0 :(得分:1)

所以我不确定如何解释这个,但是类值是标签&#34; a&#34;的属性。有两种主要方法可以解决这个问题,

1)

companies = browser.find_all(a)

for company in companies:
    if company.has_attr("class") and company.attrs['class'] == "action-view-record":
        print(company.text)

2)

另一种更清洁的方法是通过在find_all函数中实际指定attrs来实现。这可以按如下方式完成:

companies = browser.find_all("a", {"class": "action-view-record"})
for company in companies:
    print(company.text)

当然,因为python是蜜蜂的膝盖,你实际上可以在列表理解中完成所有这些:

companies = [company.text for company in browser.find_all("a", {"class": "action-view-record"})]

希望这有帮助。

更新:

我之前从未使用过robobrowser,但似乎你可以找到github page

<div class="teaser-icon">
   <span class="mega-octicon octicon-checklist"></span>
</div>

使用 -

 browser.find('div.teaser-icon')

所以......这可能适合你,

 browser.find('a.action-view-record')

如果元素位于另一个元素的旁边,也确保你在html树中的正确位置 -

<head>
   <body>
     <a class="action-view-record"> TEXT </a>
   </body>
</head>

你可能需要像这样从身体中找到(&#34; a&#34;)。

head = browser.find('head')
body = head.find("body")
atags = body.find_all("a")