Как обрабатывать ошибки при очистке якорей - PullRequest
0 голосов
/ 18 июня 2020

Мне нужно убрать якоря h2 и h3 на некоторых сайтах. Я продолжаю получать ошибки, и этот фрагмент кода не обрабатывает их правильно (он просто останавливается, а не продолжает сканирование). Мне нужен лучший способ обработки ошибок. И, если возможно, более надежный подход в целом (очистка).

for url in urls:
    try:
        req = requests.get(url)
        soup = BeautifulSoup(req.text, "lxml")
    except:
        print('error '+url)
        pass


    for sub_heading in soup.find_all('h2'): 
           with open('output.csv', 'a') as output:
               output.write('\n')
               output.write("h2 ;"+url +";"+ sub_heading.text)        

    for sub_heading in soup.find_all('h3'):
           with open('output.csv', 'a') as output:
               output.write('\n')
               output.write("h3 ;"+url +";"+ sub_heading.text)

1 Ответ

1 голос
/ 18 июня 2020

Как указано в @tripleee, вам следует отредактировать вопрос, чтобы предоставить нам как минимум описание ошибок, которые блокируют ваш код.

Однако, как правило, вам следует избегать попробуйте / исключите все без дальнейшего указания типа обрабатываемой ошибки. В частности, в данный момент вы захватываете

req = requests.get(url)
soup = BeautifulSoup(req.text, "lxml")

, что, скорее всего, завершится ошибкой, если i) url недействителен, или ii) lxml не сможет проанализировать текстовую страницу. В обоих случаях лучше спроектировать код, чтобы этого не произошло (т. Е. Заранее очистить список urls от недопустимых URL-адресов) без использования try / except. Если это окажется невозможным, вы должны хотя бы указать обработанные ошибки (например, except ConnectionError:).

Наконец, я настоятельно рекомендую вам использовать пакет csv для записи файлов csv в python и закрывать файлы каждый раз, когда вы перестаете писать в них. Ниже я пытаюсь предоставить MWE на основе предоставленных вами элементов:

import csv
import requests    
with open('output.csv', 'a') as out: # here I open the file only once
    outwriter = csv.writer(out)
    for url in urls:
        try:
            req = requests.get(url) 
            soup = BeautifulSoup(req.text, "lxml")
            for sub_heading in soup.find_all('h2'): # these are all h2s, if any
                row = ['h2', url, sub_heading.text]
                outwriter.writerow(row)
            for sub_heading in soup.find_all('h3'): # these are all h3s, if any
                row = ['h3', url, sub_heading.text]
                outwriter.writerow(row)
        except requests.exceptions.InvalidURL: # I am only capturing invalid url error: in case you happen to have more, be sure to capture them one by one
            print('Invalid Url: ' + url)
    out.close() # close the output file
...