Ошибка трассировки при запуске с - PullRequest
0 голосов
/ 26 августа 2018

Я получаю сообщение об ошибке трассировки, сообщающее AttributeError: 'NoneType' object has no attribute 'startswith', когда я заканчиваю свой сценарий. До этого момента я собирал все виды разных страниц, а затем собирал все эти разные страницы в один список, который собирал окончательный URL для каждой бизнес-страницы. Что я сделал, так это перешел на each_page и удалил все теги 'a' со страницы, а затем я хочу просмотреть их и оставить только те, которые начинаются с '/401k/'. Я знаю, что мог бы сделать это, не добавляя его в другой список, потому что чувствую, что у меня их слишком много. Я думал сделать это так:

for a in soup.findAll('a'):
    href = a.get('href')
    if href.startswith('/401k/'):
        final_url.append(href)
        #Even when I try this I get an error saying that no attribute 

В любом случае, он не получает данные, и я не могу понять, что происходит. Может быть, я слишком много смотрю на экран.

import requests
from bs4 import BeautifulSoup

url = "https://www.brightscope.com/ratings/"
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
hrefs = []
ratings = []
pages = []
s_names = []
final_url = []

for href in soup.findAll('a'):
    if 'href' in href.attrs:
        hrefs.append(href.attrs['href'])
for good_ratings in hrefs:
    if good_ratings.startswith('/ratings/'):
        ratings.append(url[:-9]+good_ratings)

del ratings[0]
del ratings[27:]

for each_rating in ratings:
    page = requests.get(each_rating)
    soup = BeautifulSoup(page.text, 'html.parser')
    span = soup.find('span', class_='letter-pages')
    if soup.find('span', class_='letter-pages'):
        for a in span.find_all('a'):
            href = a.get('href')
            pages.append('https://www.brightscope.com'+href)
    else:
        pages.append(page.url)
hrefs = []
pages = set(pages)
for each_page in pages:
    page = requests.get(each_page)
    soup = BeautifulSoup(page.text, 'html.parser')
    for a in soup.findAll('a'):
        href = a.get('href')
        s_names.append(href)
    # I am getting a traceback error AttributeError: 'NoneType' object has no attribute 'startswith' starting with the code below.
    for each in s_names:
        if each.startswith('/401k'):
            final_url.append(each)

Ответы [ 2 ]

0 голосов
/ 26 августа 2018

Проблема, с которой вы сталкиваетесь, заключается в том, что вы пытаетесь использовать оператор startswith независимо от того, присутствует значение или нет. Сначала вы должны проверить, имеет ли переменная each значение или нет. Попробуйте это

for each in s_names:
    if each and each.startswith('/401k'):
        final_url.append(each)

То, что делает вышеприведенное утверждение, сначала проверяет, является ли значение None или нет. Тогда, если значение не None, тогда он продвигается, чтобы выполнить проверку, используя startswith

0 голосов
/ 26 августа 2018
Теги

a не могут содержать href в html 5, поэтому a.get('href') возвращает None. это, вероятно, то, что вы испытываете.
Вам нужно убедиться, что вы не получите None:

for a in soup.findAll('a'):
href = a.get('href')
if href is not None:
    s_names.append(href)

Подробнее см. Здесь https://www.w3.org/TR/2016/REC-html51-20161101/textlevel-semantics.html#the-a-element

Если элемент a не имеет атрибута href, то этот элемент представляет собой заполнитель для того места, где в противном случае могла бы быть размещена ссылка, если бы она была релевантной, состоящей только из содержимого элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...