Я очень новичок в написании и работе с классами на python. Я написал парсер, используя класс, чтобы проверить, есть ли URL next page
сгенерированный методом .get_nextpage()
. Однако, когда .get_nextpage()
создает ссылку, он должен быть напечатан сразу после self.get_nextpage(soup)
в try except block
внутри .get_links()
. Я застрял здесь, как я могу это сделать.
Никакое альтернативное решение - это то, что мне нужно. Я просто хочу знать логику, если я смогу уйти.
Я использовал условие while True
в .get_links()
чтобы он выполнялся до тех пор, пока метод .get_nextpage()
создаст новую ссылку. (It not the part of this question. Just to let you know why я used "while True" there
)
Это скребок:
import requests
from bs4 import BeautifulSoup
from urllib.parse import urljoin
url = "https://stackoverflow.com/questions/tagged/web-scraping"
class StackOverflowClass(object):
def __init__(self, link):
self.url = link
def get_links(self):
while True:
res = requests.get(self.url)
soup = BeautifulSoup(res.text,"lxml")
try:
self.get_nextpage(soup)
# what to do here to get the link generated within ".get_nextpage()" method
except:break
def get_nextpage(self,sauce):
nurl = sauce.select_one("div.pager a[rel='next']")
if nurl:
link = urljoin(self.url,nurl.get("href"))
crawler = StackOverflowClass(url)
crawler.get_links()
Чтобы быть более ясным, что я имел в виду, еще раз взгляните на следующие строки:
try:
self.get_nextpage(soup)
# what to do here to get the link generated within ".get_nextpage()" method
except:break
Вы можете изменить свою страницу get_nextpage
как get_nextpage
ниже:
def get_nextpage(self,sauce):
nurl = sauce.select_one("div.pager a[rel='next']")
if nurl:
link = urljoin(self.url,nurl.get("href"))
return link
и затем вы можете использовать его в get_links()
чтобы получить значение ссылки:
def get_links(self):
while True:
res = requests.get(self.url)
soup = BeautifulSoup(res.text,"lxml")
if self.get_nextpage(soup):
link = self.get_nextpage(soup)
# do whatever you want with link
else:break
Обратите внимание, что if
/else
используется вместо try
/except
поскольку метод/функция без явного return
возвращает None
и try: None
никогда не будет генерировать исключение, и цикл break
не будет выполнен
return link
одну вкладку слева (кроме того, что вы сделали), я получаю тот же результат. Какой путь я должен следовать? Благодарю.
if nurl
возвращает True
, но если он возвращает False
link = self.get_nextpage(soup)
не будет выполняться, а строка return link
приведет к NameError
. Но вы можете сделать else: link = ""
. В этом случае все в порядке, чтобы переместить return link
get_nextpage
. Вы хотелиreturn link
?return link
в конце определенияget_nextpage
(в блокеif
). Также заменитеtry: self.get_nextpage(soup)
наif self.get_nextpage(soup)
иexcept: break
наelse: break