список неисправностей веб-приложения Python - PullRequest
0 голосов
/ 02 сентября 2018

Мне нужна помощь с кодом, над которым я работаю для моего курса, цель состоит в следующем: Найдите ссылку в позиции 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])

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

Ответы [ 3 ]

0 голосов
/ 02 сентября 2018

Проблема в том, что, хотя вы распечатываете 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))
0 голосов
/ 02 сентября 2018

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

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».

0 голосов
/ 02 сентября 2018

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

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

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

EDIT:

enter image description here

...