首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Python/BeautifulSoup Web-刮取问题-不规则返回

Python/BeautifulSoup Web-刮取问题-不规则返回
EN

Stack Overflow用户
提问于 2018-05-21 21:50:12
回答 1查看 225关注 0票数 0

我仔细研究了问题/答案,并试图实现以下更改,但都没有效果。

我试图从Coursera的“数据分析”结果( https://www.coursera.org/browse/data-science/data-analysis?languages=en&page=1 )中抓取课程列表中的页面。

有9页,每一页有25门课程,每个课程都有自己的<h2>标签。我发现下面的代码取得了一些成功,但并不是一致的:

代码语言:javascript
运行
复制
courses_data_sci = []
for i in range(10):
    page = "https://www.coursera.org/browse/data-science/data-analysis? languages=en&page=" + str(i)
    html = urlopen(page)
    soup = BeautifulSoup(html.read(), "html.parser")

for meta in soup.find_all('div', {'id' : 'rendered-content'}):
    for x in range(26):
        try:
            course = meta.find_all('h2')[x].text.strip()
            courses_data_sci.append(course)
        except IndexError:
            pass

这段代码似乎返回前2-3页的结果和最后一页的结果;有时,如果我在运行courses_data_sci之后再次运行它,它将返回第4页的结果几次。(我在木星工作,我重新启动了内核,以解决任何问题。)

我不知道为什么代码不能正常工作,更不用说为什么返回不一致的结果了。

任何帮助都是非常感谢的。谢谢。

更新

谢谢你的想法.我正在努力利用这两种方法来使代码工作。

出于好奇,我削减了代码,看看它正在收集什么,同时考虑到这两个评论。

代码语言:javascript
运行
复制
courses_data_sci = []
session = requests.Session()

for i in range(10):
    page = "https://www.coursera.org/browse/data-science/data-analysis? languages=en&page=" + str(i)
    html = urlopen(page)
    soup = BeautifulSoup(html.read(), "html.parser")

    for meta in soup.find_all('div', {'id' : 'rendered-content'}):
        course = meta.find_all('h2')
        courses_data_sci.append(course)


    # This is to check length of courses_data_sci across pages
    print('Page: %s  -- total length %s' % (i, len(courses_data_sci)))

这实际上会产生一个列表,其中包含了整个9页的所有课程(当然,href信息还没有被删除)。每个循环每页创建一个列表:相应页面上所有课程的列表。因此,当列表被推到列表( courses_data_sci )时,我应该能够去掉这个列表。

每个课程有两个<h2>标记,所以我也认为第二个range()调用:for x in range(26)可能有问题。我尝试了多个不同的范围,其中没有一个工作或返回一个错误,“索引超出范围”。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-21 23:19:07

用你的代码我也有同样的行为。

我更改它是为了使用请求:

代码语言:javascript
运行
复制
from bs4 import BeautifulSoup
import requests

courses_data_sci = []
session = requests.Session()

for i in range(10):
    page = "https://www.coursera.org/browse/data-science/data-analysis?languages=en&page=" + str(i)
    html = session.get(page)
    soup = BeautifulSoup(html.text, "html.parser")

    for meta in soup.find_all('div', {'id' : 'rendered-content'}):
        for x in range(26):
            try:
                course = meta.find_all('h2')[x].text.strip()
                courses_data_sci.append(course)
            except IndexError:
                pass

    # This is to check length of courses_data_sci across pages
    print('Page: %s  -- total length %s' % (i, len(courses_data_sci)))
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50457043

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档