尝试/除了在URL末尾抓取3个随机数的站点

时间:2017-08-28 23:41:16

标签: python web-scraping beautifulsoup python-requests

我正在尝试使用Python的BeautifulSoup和Requests从巴西最高法院获取数据。

144个链接中的每一个最后都有1到3之间的数字(例如:http://www.stf.jus.br/portal/remuneracao/listarRemuneracao.asp?periodo=012007&ano=2007&mes=01&folha=3)。

'folha'(表格,葡萄牙语)部分没有图案。有些月份是1,其他月份是2或3.这似乎是随机的。当访问具有错误号码的URL时,该网站会加载,但会显示“A folhasolicitadanãoéválida”(请求的表格无效,请使用葡萄牙语)。

在我的代码(下面)中,在创建包含没有“工作表”编号的链接的列表后,我加载页面并检查消息是否存在。如果是,使用try方法,代码会在URL中附加以下数字(2或3)。

但是代码没有运行。有没有办法在代码中使用try / except 3个可能的结果?

   records=[]
    for x in links:
        r = requests.get(x+'1')
        soup = BeautifulSoup(r.text, 'html.parser')
        if BeautifulSoup(r.text, 'html.parser') == 'A folha solicitada não é válida':
            try:
                r = requests.get(x+'2')
                soup = BeautifulSoup(r.text, 'html.parser')
                if BeautifulSoup(r.text, 'html.parser') == 'A folha solicitada não é válida':
                    try:
                        r = requests.get(x+'3')
                        soup = BeautifulSoup(r.text, 'html.parser')
                    else:
                        continue
            else:
                continue

        mes = x[-30:-28]+'/'+x[-28:-24] 
        ativos = soup.find_all('table', {'id':'ministros_ativos'})
        ativos = ativos[0]
        for x in range(0,11):
            nome = ativos.find_all('a', {'class':'exibirServidor'})[x].text
        salarios = ativos.contents[3].findAll('td', {'align':'right'})
        salarios_brutos = salarios[::2]
        salarios_liquidos = salarios[1::2]
        for x in salarios_liquidos:
            liquido = x.text

        for x in salarios_brutos:
            bruto = x.text

        records.append((nome, bruto, liquido, mes))

1 个答案:

答案 0 :(得分:1)

您可以使用range创建1到3之间的数字列表,并迭代该列表以生成网址。如果响应有效,请中断循环并继续执行代码。

for x in links:
    for i in range(1,4):
        try:
            r = requests.get(x+str(i))
        except Exception as e:
            continue
        if 'A folha solicitada não é válida' not in r.text:
            break
    else:
        continue
    soup = BeautifulSoup(r.text, 'html.parser')

注意:

对于python 2,您必须将错误消息转为unicode。 (使用u前缀)

requests不会引发404响应的异常,因此您不需要尝试/除此之外,但是可能会发生其他异常。

使用except来捕获异常。在{/ 1}}之后的try / except / else块中使用else,如果没有异常发生则执行except

如果循环没有中断,则执行for / else块中的else语句。基本上它意味着“如果没有收到有效的响应,则继续下一个x”。