Ошибка из-за отсутствия parent.contents на некоторых веб-страницах

#python #web-scraping #beautifulsoup

#python #очистка веб-страниц #beautifulsoup

Вопрос:

Я пытаюсь очистить информацию с сайта, но получаю сообщение об ошибке:

 AttributeError: 'NoneType' object has no attribute 'parent'
  

Не могли бы вы рассказать мне, как пропустить эту ошибку и продолжить сбор данных?
Код, который я использовал, является

 import requests
from bs4 import BeautifulSoup
from concurrent.futures import ThreadPoolExecutor
import pandas as pd


def main(req, num):
    r = req.get(web "/page/{}/".format(num))
    soup = BeautifulSoup(r.content, 'html.parser')
    for article in soup.select('article.border_top'):
        print(article.select_one('span.homepage_post-date').text)
        print(article.select_one('h1.homepage_post_title').text)
        print(article.select_one('p').text)
        try:
            print(article.select_one("a.read-more").parent.contents[0])# this seems causing the issue
        except:
            print(num)
    return article.select_one('span.homepage_post-date').text, article.select_one('h1.homepage_post_title').text, article.select_one('p').text, article.select_one("a.read-more").parent.contents[0]  # this seems causing the issue


with ThreadPoolExecutor(max_workers=30) as executor:
    with requests.Session() as req:
        fs = [executor.submit(main, req, num) for num in range(1, 128)] # this sets the range of pages
        allin = []
        for f in fs:
            allin.append(f.result())
  

Комментарии:

1. Пожалуйста, поделитесь URL-адресом

Ответ №1:

вы должны получить доступ к родительскому узлу в блоке try, просто присвоите значение здесь, если узел отсутствует, установите значение по умолчанию:

 parent_content = None
try:
    parent_content = article.select_one("a.read-more").parent.contents[0])
except:
    parent_content = 'some default value'
  

В более общем плане вам следует использовать try … за исключением верхнего уровня цикла, любая ошибка должна быть зафиксирована и напечатать сообщение, но не прерывать итерацию, это практический трюк для обхода с моей стороны