【发布时间】: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