Не могу использовать ссылку, сгенерированную методом в моем скребке

1

Я очень новичок в написании и работе с классами на 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
  • 1
    Вы ничего не возвращаете с get_nextpage . Вы хотели return link ?
  • 1
    Попробуйте добавить return link в конце определения get_nextpage (в блоке if ). Также замените try: self.get_nextpage(soup) на if self.get_nextpage(soup) и except: break на else: break
Показать ещё 2 комментария
Теги:
class
python-3.x
web-scraping

1 ответ

1
Лучший ответ

Вы можете изменить свою страницу 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 не будет выполнен

  • 0
    Небольшой вопрос об отступе: если я использую return link одну вкладку слева (кроме того, что вы сделали), я получаю тот же результат. Какой путь я должен следовать? Благодарю.
  • 0
    Нет, вы не получите тот же результат на самом деле. Это работает, if nurl возвращает True , но если он возвращает False link = self.get_nextpage(soup) не будет выполняться, а строка return link приведет к NameError . Но вы можете сделать else: link = "" . В этом случае все в порядке, чтобы переместить return link

Ещё вопросы

Сообщество Overcoder
Наверх
Меню