【问题标题】:Unable to retrieve <a> tag href (starts with "?" instead of http/s) using beautifulsoup无法使用 beautifulsoup 检索 <a> 标签 href(以“?”而不是 http/s 开头)
【发布时间】:2016-01-14 13:57:52
【问题描述】:

这是我第一次进行网络抓取,我正在尝试抓取以下网站的网页 (1-...):

http://jobs.monster.com/search/?q=data%20science

使用python beautifulsoup,但似乎无法识别页面的标签。 标签看起来像这样:

<a href="?q=data-science&amp;page=1" class="page-link">1</a>

我的部分代码如下所示:

import urlparse
import urllib
import re
from bs4 import BeautifulSoup

# start with this page
url = "http://jobs.monster.com/search/?q=data%20science"
       #http://jobs.monster.com/search/?q=data%20science&page=2

# stack of urls from nytimes
urls = [url]
#print urls

# visited urls
visited = [url]

while len(urls) > 0:
    try:
        htmltext = urllib.urlopen(urls[0]).read()
    except:
        print urls[0]

    soup = BeautifulSoup(htmltext)


    urls.pop(0)

    for tag in soup.find_all('a', {'class':'page-link'}):
        print tag

我没有收到任何错误,但也没有打印任何内容...我猜这是因为 href 不是以 http/s 开头的?

谁能帮忙?

谢谢

【问题讨论】:

  • 您尝试抓取的页面可能是由 javascript 动态生成的。 BeautifulSoup 和 urllib 都不执行 javascript,因此它看到的页面没有链接。将您正在获取的 htmltext 转储到本地文件中,并查看它实际获取的内容。

标签: python html beautifulsoup web-crawler


【解决方案1】:

问题是您的网站在加载urllib 时不包含具有page-link 类的锚点。

无论您在浏览器中看到什么。这是因为 JavaScript 创建了指向下一个站点的页面链接。如果您使用具有良好开发工具的浏览器(我使用 Chrome),您可以禁用网站上的 JavaScript 执行。如果您这样做并再次加载网站,您将看到分页消失。

但要解决您的问题,您可以提取职位结果计数并根据此值创建 URL 列表:每个站点显示 20 个职位发布。您可以将结果计数除以 20,然后查看您必须抓取多少页。当然,这仅适用于结果低于 1000 的搜索。超过 1000 个结果您只会显示“1000+ 个结果”,因此您无法真正计算页面数量。

但是,如果您仔细查看已加载页面的源代码,您可以找到创建分页的 JavaScript 标记。这包括您可以用来创建要抓取的 URL 列表的页面总数。当然,这将包括一些文本解析,但如果您投入一些时间,您可以找到一种方法。

如果您有大量页面,您可以创建一个循环(或生成器)并将您的注释行用于下一个 url:

for p in range(2,page_count+1):
      url = "http://jobs.monster.com/search/?q=data%20science&page="+str(p)

urls = ["http://jobs.monster.com/search/?q=data%20science&page="+str(p) for p in range(2, page_count+1)]

循环从 2 开始,因为您已经拥有第一个站点,因此无需再次加载。

【讨论】:

    【解决方案2】:

    感谢 GHajba 的详细解释!

    这或多或少是我最终做的:

    try:
        for i in range(2, 100):
            page = urlparse.urljoin(mainUrl, "?q=data%20science&page=" + str(i))
            readPage = urllib.urlopen(page).read()
            soup = BeautifulSoup(readPage)
    except:
        pass
    

    谢谢大家!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-11
      • 2016-01-17
      • 1970-01-01
      • 1970-01-01
      • 2016-11-24
      • 2017-06-08
      • 1970-01-01
      相关资源
      最近更新 更多