Список для сбоев веб-приложений на Python

голоса
0

Я новичок на сайте, я не уверен , что это правильное место , чтобы задать вопросы питона, если не пожалуйста , сообщите мне , и я вновь после этого в нужном месте. Мне нужна помощь с кодом , который я работаю для моего класса Coursera, цель состоит в следующем: Найти ссылку на позиции 18 (первое название 1). Следуйте по этой ссылке. Повторите этот процесс в 7 раз. Ответ последнее имя , которое вы извлекаете. Подсказка: первый символ имени последней страницы , что вы будете загружать это: J от ссылки :( http://py4e-data.dr-chuck.net/known_by_Shannon.html )

Я написал код для выполнения этой задачи, но кажется, что он работал только для первого элемента, и каждый сайт так как это первый, код в списке неисправности. Моя идея заключается в том, чтобы получить код Html и добавьте URL в список, а затем найти 18-й элемент из списка, а затем перенаправить весь цикл с новым URL и удалить старый список. Повторяя процесс 7 раз. Я серьезно спутать с того, где именно код пошло не так. Заранее спасибо.

    import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import ssl
import re
term_counter = (0)
file = list()
regex = list()
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = input('Enter - ')
for I in range(7) :
    html = urllib.request.urlopen(url, context=ctx).read()
    soup = BeautifulSoup(html, 'html.parser')
    tags = soup('a')
    del file[:]
    file = list()
    for tag in tags :
        file.append(tag)
        print(tag.contents[0])
        url = tag.get('href')
        print (url)
    for items in range(17,18) :
        print(file[items])
Задан 02/09/2018 в 05:22
источник пользователем
На других языках...                            


3 ответов

голоса
0

Мне кажется, вопрос в классе просит рекурсивный подход:

import bs4
import requests

url = 'http://py4e-data.dr-chuck.net/known_by_Shannon.html'

def get_url(url):
     page_response = requests.get(url)
     soup = BeautifulSoup(page_response.content, "html.parser")
     return soup.find_all('a')[17].get('href')

def routine(url, counter):
    if counter > 0:
    url = get_url(url)
    print(url)
    counter -= 1
    routine(url, counter)

routine(url, 7)

выход:

http://py4e-data.dr-chuck.net/known_by_Stacey.html
http://py4e-data.dr-chuck.net/known_by_Zoya.html
http://py4e-data.dr-chuck.net/known_by_Haiden.html
http://py4e-data.dr-chuck.net/known_by_Ayrton.html
http://py4e-data.dr-chuck.net/known_by_Leilan.html
http://py4e-data.dr-chuck.net/known_by_Thorben.html
http://py4e-data.dr-chuck.net/known_by_Jahy.html

Первый символ имени последнего URL, подтверждаются, чтобы начать с «J».

Ответил 02/09/2018 в 16:33
источник пользователем

голоса
0

Проблема заключается в том, что , хотя вы распечатайте 18 - tagsзапись, вы не установите urlэто значение. К сожалению, использовать urlтакже в вашем tagsцикле, так что вы не замечаете эту ошибку. В коде urlвсе еще установлен до последнего входа tags. Если распечатать Iс фактическим urlиспользуется в цикле (раскомментировать соответствующие строки), вы увидите следующее:

0 http://py4e-data.dr-chuck.net/known_by_Shannon.html
['Riya', 'Terri', 'Coban', 'Oswald', 'Codie', 'Arshjoyat', 'Carli', 'Aieecia', 'Ronnie', 'Yelena', 'Abid', 'Prithvi', 'Ellenor', 'Shayla', 'Chala', 'Nelson', 'Chaitanya', 'Stacey', 'Karis', 'Mariyah', 'Jamie', 'Breeanna', 'Kendall', 'Adelaide', 'Aimiee', 'Manwen', 'Dennys', 'Benjamyn', 'Reynelle', 'Jesuseun', 'Malik', 'Brigitte', 'Farah', 'Youcef', 'Ruqayah', 'Mili', 'Caitaidh', 'Raul', 'Katelyn', 'Yakup', 'Cohan', 'Lylakay', 'Dougray', 'Silvana', 'Roxanne', 'Tanchoma', 'Andie', 'Aarman', 'Kyalah', 'Tayyab', 'Malikah', 'Bo', 'Oona', 'Daniil', 'Wardah', 'Jessamy', 'Karly', 'Tala', 'Ilyaas', 'Maram', 'Ruaidhri', 'Donna', 'Liza', 'Aileigh', 'Muzzammil', 'Chi', 'Serafina', 'Abbas', 'Rhythm', 'Jonny', 'Niraj', 'Ciara', 'Kylen', 'Demmi', 'Christianna', 'Tanzina', 'Brianna', 'Kevyn', 'Hariot', 'Maisie', 'Naideen', 'Nicolas', 'Suvi', 'Areeb', 'Kiranpreet', 'Rachna', 'Umme', 'Caela', 'Miao', 'Tansy', 'Miah', 'Luciano', 'Karolina', 'Rivan', 'Cavan', 'Benn', 'Haydn', 'Zaina', 'Rafi', 'Ahmad']
<a href="http://py4e-data.dr-chuck.net/known_by_Stacey.html">Stacey</a>
1 http://py4e-data.dr-chuck.net/known_by_Ahmad.html
['Tilhi', 'Rachel', 'Latif', 'Deryn', 'Pawel', 'Anna', 'Blake', 'Brehme', 'Jo', 'Laurajane', 'Khayla', 'Declyan', 'Graidi', 'Foosiya', 'Nabeeha', 'Otilija', 'Dougal', 'Adeena', 'Alfie', 'Angali', 'Lilah', 'Saadah', 'Kelam', 'Kensey', 'Tabitha', 'Peregrine', 'Abdisalam', 'Presley', 'Allegria', 'Harish', 'Arshjoyat', 'Hussan', 'Sammy', 'Ama', 'Leydon', 'Anndra', 'Anselm', 'Logyne', 'Fion', 'Jacqui', 'Reggie', 'Mounia', 'Pedro', 'Hussain', 'Raina', 'Inka', 'Shaylee', 'Riya', 'Phebe', 'Uzayr', 'Isobella', 'Abdulkadir', 'Johndean', 'Charlotte', 'Moray', 'Saraah', 'Liana', 'Keane', 'Maros', 'Robi', 'Rowanna', 'Wesley', 'Maddox', 'Annica', 'Oluwabukunmi', 'Jiao', 'Nyomi', 'Hamish', 'Bushra', 'Marcia', 'Rimal', 'Kaceylee', 'Limo', 'Dela', 'Cal', 'Rhudi', 'Komal', 'Stevey', 'Amara', 'Nate', 'Roma', 'Fatou', 'Marykate', 'Abiya', 'Bay', 'Kati', 'Carter', 'Niraj', 'Maisum', 'Jaz', 'Coban', 'Harikrishna', 'Armani', 'Muir', 'Ilsa', 'Benjamyn', 'Russel', 'Emerson', 'Rehaan', 'Veronica']
<a href="http://py4e-data.dr-chuck.net/known_by_Adeena.html">Adeena</a>

Чтобы избежать этой проблемы, вы должны установить urlдля следующего цикла к 18 - й записи:

import urllib.request, urllib.parse, urllib.error
from bs4 import BeautifulSoup
import ssl
#import re
term_counter = (0)
file = list()
#regex = list()
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = input('Enter - ')
for _I in range(7) :
    #print(_I, url) <- this prints out the _I value of the loop and the url used in this round
    html = urllib.request.urlopen(url, context=ctx).read()
    soup = BeautifulSoup(html, 'html.parser')
    tags = soup('a')
    #print([item.contents[0] for item in tags]) <- this prints out a list of all names on this page
    file = list()
    for tag in tags :
        file.append(tag)
        #this is the last url you used in your code for the next _I loop
        url = tag.get('href') 
    #so we have to redefine url as the 18th entry in your list for the next _I loop round
    url = file[17].get("href")
    print("The next url we will use is {}".format(url))
Ответил 02/09/2018 в 09:42
источник пользователем

голоса
0

Вы можете попробовать это:

import bs4
import requests

url = 'http://py4e-data.dr-chuck.net/known_by_Shannon.html'

for I in range(7) :
    session = requests.get(url)
    soup = bs4.BeautifulSoup(session.text, "html.parser")
    target_list = soup.findAll("li")[17]
    href = target_list.find("a").get("href")
    link_name = target_list.find("a").text

    if(I == 6):
        print('Solution is ' + link_name)
    else:
        print('Name is: ' + link_name)
        print('Going to web is: ' + href)
        url = href

Ответ будет последним link_name распечатаны.

РЕДАКТИРОВАТЬ:

введите описание изображения здесь

Ответил 02/09/2018 в 09:42
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more