Как заставить код перейти по другой ссылке после первой? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь найти ссылку в позиции 3 URL-адреса (имя 1). Перейдите по этой ссылке. Повторите этот процесс 4 раза. В конце я хочу напечатать последнюю ссылку.

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

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

url = 'http://py4e-data.dr-chuck.net/known_by_Fikret.html'
count = int(input('Enter Count '))
position = int(input('Enter Position ')) -1
while count >= 0:
    html = urlopen(url, context=ctx).read()
    soup = BeautifulSoup(html, "html.parser")
    tags = soup('a')
    for tag in tags:
        values = tag.get('href', None)
        values = str(values)
        lst.append(values)
        count = count - 1
        lst2.append(lst[position:position+1])
        url = lst2[0]
        url = str(url)
        print(re.findall('http.+html',url))
        lst.clear()
        lst2.clear()
    return url

Ответы [ 2 ]

0 голосов
/ 13 февраля 2020

Я смог ответить на свой вопрос, немного поиграв с кодом. Я уверен, что есть гораздо более красноречивое решение, но я очень рад, что наконец-то смог правильно его запустить.

from urllib.request import urlopen
from bs4 import BeautifulSoup
import ssl
import re
lst = list()
count = 0
# Ignore SSL certificate errors
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

url = 'http://py4e-data.dr-chuck.net/known_by_Fikret.html'
count = int(input('Enter Count '))
position = int(input('Enter Position ')) -1
while True:
    html = urlopen(url, context=ctx).read()
    soup = BeautifulSoup(html, "html.parser")
    tags = soup('a')
    for tag in tags:
        values = tag.get('href', None)
        values = str(values)
        lst.append(values)
    url = str(lst[position:position+1])
    url = url[2:-2]
    print(url)
    lst.clear()
    count = count -1
    if count == 0:break
0 голосов
/ 13 февраля 2020

Если я правильно анализирую ваш вопрос, один из способов сделать это (я оставлю проверку ошибок в качестве упражнения для вас; также код не был выполнен) будет выглядеть так:

# Loop count times; "_" effectively means ignore the counter
for _ in range(count):
    # Get an array of <a> elements,
    #   then get the (position-1)th
    #   then get the text of the 'href' tag
    next_url = soup.find_all('a')[position-1]['href']
    # And repeat for the URL found there
    html = urlopen(next_url, context=ctx).read()
    soup = BeautifulSoup(html, "html.parser")

# Finally, print out the (position-1)th URL on the last page
print(soup.find_all('a')[position-1]['href'])

Of Конечно, если на странице недостаточно ссылок, или есть теги <a> без href, или URL-адрес href искажен, программа выполнит sh.

...