Невозможно обработать две ссылки, имеющие различную нумерацию страниц, используя декоратор - PullRequest
0 голосов
/ 05 декабря 2018

Я написал скрипт на python, используя две разные ссылки (one has pagination but the other doesn't), чтобы проверить, может ли мой скрипт получить все ссылки на следующей странице.Необходимо, чтобы сценарий напечатал эту строку No pagination found, если нет опции разбивки на страницы.

Я применил @check_pagination для проверки наличия нумерации страниц, и я хочу оставить этот декоратор в своем скребке.

Я уже достиг того, что я описал выше, выполнив следующее:

import requests
from bs4 import BeautifulSoup

urls = [
        "https://www.mobilehome.net/mobile-home-park-directory/maine/all",
        "https://www.mobilehome.net/mobile-home-park-directory/rhode-island/all"
    ]

def check_pagination(f):
  def wrapper(lead):
     if not lead.pages:
       print('No pagination found')
     return f(lead)
  return wrapper

class LinkScraper:
   def __init__(self, url):
     self.url = url
     self.home_page = requests.get(self.url).text
     self.soup = BeautifulSoup(self.home_page,"lxml")
     self.pages = [item.text for item in self.soup.find('div', {'class':'pagination'}).find_all('a')][:-1]

   @check_pagination
   def __iter__(self):
     for p in self.pages:
        link = requests.get(f'{self.url}/page/{p}')
        yield link.url

for url in urls:
    d = [page for page in LinkScraper(url)]
    print(d)

Теперь я хочу сделать то же самое, не используя класс и сохраняя decorator в моемскрипт для проверки нумерации страниц, но кажется, что я что-то не так в decorator, и именно поэтому он не печатает No pagination found, даже если ссылка не имеет нумерации страниц.Буду признателен за любую помощь, чтобы исправить это.

import requests
from bs4 import BeautifulSoup

urls = [
        "https://www.mobilehome.net/mobile-home-park-directory/maine/all",
        "https://www.mobilehome.net/mobile-home-park-directory/rhode-island/all"
    ]

def check_pagination(f):
    def wrapper(*args,**kwargs):
        if not f(*args,**kwargs): 
            print("No pagination found")
        return f(*args,**kwargs)
    return wrapper

def get_base(url):
    page = requests.get(url).text
    soup = BeautifulSoup(page,"lxml")
    return [item.text for item in soup.find('div', {'class':'pagination'}).find_all('a')][:-1]

@check_pagination
def get_links(num):
    link = requests.get(f'{url}/page/{num}')
    return link.url

if __name__ == '__main__':
    for url in urls:
        links = [item for item in get_base(url)]
        for link in links:
            print(get_links(link))

1 Ответ

0 голосов
/ 05 декабря 2018

Просто примените декоратор к get_base:

def check_pagination(f):
   def wrapper(*args,**kwargs):
     result = f(*args,**kwargs)
     if not result: 
        print("No pagination found")
     return result
   return wrapper

@check_pagination  
def get_base(url):
   page = requests.get(url).text
   soup = BeautifulSoup(page,"lxml")
   return [item.text for item in soup.find('div', {'class':'pagination'}).find_all('a')][:-1]


def get_links(num):
   link = requests.get(f'{url}/page/{num}')
   return link.url

if __name__ == '__main__':
  for url in urls:
    links = [item for item in get_base(url)]
    for link in links:
        print(get_links(link))
...