【问题标题】:Scraping and HTTP Error 404抓取和 HTTP 错误 404
【发布时间】:2018-02-27 23:38:03
【问题描述】:

观看 youtube 视频以了解如何抓取多个页面。我逐行复制了视频行并遇到了一些问题。首先,这是 HTTP 错误 404。

[这是我的代码]

我相信在快速搜索之后,我认为这是因为没有字母“x”的 URL。如果我错了,请纠正我。有没有办法从 ascii_lowercase 中减去字母“x”?

here is my code

我的第二个问题就像我在视频中所说的那样,我逐行复制了代码行,但我没有得到球员姓名和数据。我在检查后确实注意到玩家名称被标记为“th”并且不包含在“td”中。我尝试添加另一个 for 循环,但无法正常工作。

感谢您的帮助!

【问题讨论】:

  • ascii_lowercase string.ascii_lowercase?如果是这种情况,您可以使用ascii_lowercase.replace('x', '') 摆脱x。但是查看您提供的图像,我认为错误可能在其他地方。你能提供更多的上下文吗? make_soup 的内容和完整的堆栈跟踪会有所帮助。
  • youtube.com/watch?v=H8wUYz22joM 这是视频的链接。抱歉,如果这看起来很懒惰,但老实说,就像我说的我是这方面的初学者,所以跳过视频进行解释可能更容易。该视频之前的课程是他更详细地介绍代码本身的课程。
  • 没关系。你能把你有的代码贴在某个地方,这样我就可以在本地测试它,而不必从视频中手动复制?

标签: python beautifulsoup


【解决方案1】:

似乎urllib.request.urlopen 在 http 状态代码为 404 时抛出异常。我不知道这一点。如果这只发生在使用字母 x 构建的 url 上,则使用

string.ascii_lowercase.replace('x', '')

应该可以。

如果不是这种情况,更具防御性的方法是在make_soup 调用中添加一个try 块,并在错误发生时执行某些操作。像这样的:

import string
import urllib
import urllib.request
from bs4 import BeautifulSoup

def make_soup(url):
    r = urllib.request.urlopen(url)
    return BeautifulSoup(r, 'html.parser')

playerdatasaved = ''

for letter in string.ascii_lowercase:
    url = 'https://www.basketball-reference.com/players/' + letter + '/'

    try:
        soup = make_soup(url)
    except urllib.error.HTTPError:
        print('{} not found'.format(url))
        continue

    for record in soup.findAll('tr'):
        playerdata = ''
        for data in record.findAll('td'):
            playerdata = playerdata + ',' + data.text
        if len(playerdata) != 0:
            playerdata = playerdatasaved + "\n" + playerdata[1:]

这只会记录未找到的 url 并跳到下一个循环迭代,您可能想要(或需要)做其他事情。

您可能想查看here 以了解有关 python 中的错误处理的更多信息。

【讨论】:

    猜你喜欢
    • 2020-12-20
    • 2020-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-30
    相关资源
    最近更新 更多