【问题标题】:Unable to handle two links having different pagination using decorator无法使用装饰器处理具有不同分页的两个链接
【发布时间】:2018-12-05 18:03:41
【问题描述】:

我使用两个不同的链接(one has pagination but the other doesn't) 在 python 中编写了一个脚本,以查看我的脚本是否可以获取所有下一页链接。如果没有分页选项,脚本必须打印此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))

【问题讨论】:

    标签: python python-3.x function web-scraping decorator


    【解决方案1】:

    只需将装饰器应用到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))
    

    【讨论】:

    • 你是 @Ajax1234 人的瑰宝。谢谢,非常感谢。
    • @asmitu 感谢您的评论!请查看我最近的编辑,现在已修复
    猜你喜欢
    • 2019-12-30
    • 1970-01-01
    • 1970-01-01
    • 2016-04-29
    • 2015-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多