#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 … за исключением верхнего уровня цикла, любая ошибка должна быть зафиксирована и напечатать сообщение, но не прерывать итерацию, это практический трюк для обхода с моей стороны