Scrape href不适用于python

时间:2018-08-24 20:34:00

标签: python beautifulsoup href

我有此代码的副本,我正在尝试这样做,每次我逐行复制它都无法正常工作。我非常沮丧,似乎无法弄清楚哪里不起作用。我想做的是去一个网站,废弃标有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 :(得分:2)

您正试图过早获得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)

根据您的用例,您可能需要做一些不同的事情,但这将向您指示哪些页面与您的抓取模型不匹配,需要手动进行调查。

答案 1 :(得分:0)

您可能打算做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为您提供所需的标记对象的列表。