无法检索<a> tag href (starts with &#34;?&#34; instead of http/s) using beautifulsoup

时间:2015-10-15 22:57:10

标签: python html beautifulsoup web-crawler

This my first time web crawling and I am trying to web crawl, only the pages (1-...), of the following website:

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开头的?

有人可以帮忙吗?

由于

2 个答案:

答案 0 :(得分:2)

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

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

但是要解决您的问题,您可以提取作业结果计数并根据此值创建URL列表:每个站点显示20个作业发布。您可以将结果计数除以20,并查看您需要抓取的页数。当然,这仅适用于结果低于1000的搜索。超过1000个结果只能获得&#34; 1000+个结果&#34;显示,因此您无法真正计算页数。

但是,如果仔细查看加载页面的源代码,可以找到创建分页的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开始,因为您已经拥有了第一个站点,因此无需再次加载它。

答案 1 :(得分:0)

感谢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

谢谢大家!