Соскоб href не работает с питоном - PullRequest
0 голосов
/ 24 августа 2018

У меня есть копии этого самого кода, который я пытаюсь сделать, и каждый раз, когда я копирую его построчно, он работает неправильно. Я более чем разочарован и не могу понять, где это не работает. То, что я пытаюсь сделать, это перейти на веб-сайт, очистить различные страницы оценок, которые помечены как A, B, C ... и т. Д. Затем я иду на каждый сайт, чтобы узнать общее количество страниц, которые они используют. Я пытаюсь очистить <span class='letter-pages' href='/ratings/A/1' и так далее. Что я делаю неправильно?

import requests
from bs4 import BeautifulSoup
url = "https://www.brightscope.com/ratings/"
page = requests.get(url)
soup = BeautifulSoup(page.text, 'html.parser')
hrefs = []
ratings = []
ks = []
pages_scrape = []

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)
# elif good_ratings.startswith('/401k'):
#     ks.append(url[:-9]+good_ratings)
del ratings[0]
del ratings[27:]
print(ratings)

for each_rating in ratings:
    page  = requests.get(each_rating)
    soup = BeautifulSoup(page.text, 'html.parser')
    for href in soup.find('span', class_='letter-pages'):
        #Not working Here
        pages_scrape.append(href.attrs['href'])
        # Will print all the anchor tags with hrefs if I remove the above comment.
        print(href)

Ответы [ 2 ]

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

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

for each_rating in ratings:
    page  = requests.get(each_rating)
    soup = BeautifulSoup(page.text, 'html.parser')
    span = soup.find('span', class_='letter-pages')
    for a in span.find_all('a'):
        href = a.get('href')
        pages_scrape.append(href)

Я не проверял это на всех страницах, но он работал для первой. Вы указали, что на некоторых страницах содержание не очищалось, что связано с поиском span, возвращающим None. Чтобы обойти это, вы можете сделать что-то вроде:

for each_rating in ratings:
    page  = requests.get(each_rating)
    soup = BeautifulSoup(page.text, 'html.parser')
    span = soup.find('span', class_='letter-pages')
    if span:
        for a in span.find_all('a'):
            href = a.get('href')
            pages_scrape.append(href)
            print(href)
    else:
        print('span.letter-pages not found on ' + page)

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

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

Вы, вероятно, хотели сделать find_all вместо find - поэтому измените

for href in soup.find('span', class_='letter-pages'):

до

for href in soup.find_all('span', class_='letter-pages'):

Вы хотите перебирать список тегов, а не один тег. find даст вам один объект тега. Когда вы перебираете один тег, вы перебираете объекты NavigableString. find_all дает вам список объектов тегов, которые вы хотите.

...