python - 无法使用 beautifulsoup 检索 <a> 标签 href(以 "?"而不是 http/s 开头)

标签 python html beautifulsoup web-crawler

这是我第一次进行网络爬行,我正在尝试仅对以下网站的页面(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 开头?

有人可以帮忙吗?

谢谢

最佳答案

问题是您的网站在使用 urllib 加载时不包含 page-link 类的 anchor 。

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

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

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

关于python - 无法使用 beautifulsoup 检索 <a> 标签 href(以 "?"而不是 http/s 开头),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33159895/

相关文章:

jquery - 使文本列表保持在页脚上方,但能够将它们滚动到撰写栏下方

python - 美丽汤内存泄漏

python - python中列表字典的概率

python - 通过 POST multipart/form-data 从 windows phone 8.1 Silverlight Httpclient 上传文件到 python 服务器损坏文件

c++ - 通过 CGI python 脚本在服务器端运行 .exe 文件

XML 解析器删除处理指令结束定界符的问号

Python 网站使用 'soup.findall' 抓取所有标签

python - matplotlib 在不重新采样的情况下绘制小图像

纯十六进制形式的 Python 字符串

javascript - jQuery slideToggle 函数仅在相关元素上运行