【发布时间】:2019-05-02 14:17:54
【问题描述】:
我在 python 中编写了一个脚本,通过跟踪其登录页面的基本链接来获取一些帖子的链接。如果我坚持传统的方法,我自己也可以刮。
但是,我的目标是使用 decorator 来做同样的事情。看来我已经接近了,但是在将链接从函数get_links() 传递到get_target_link() 时我被卡住了。我使用return func() 作为函数get_target_link() 中的占位符,因为我不知道如何传递链接。函数get_links() 中有打印语句(如果未注释则有效),以确保我在正确的轨道上。
如何将链接 return linklist 从 get_links() 传递到 get_target_link(),以便在必要时重新使用它们?
这是我迄今为止尝试过的:
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup
url = "https://www.janglo.net/component/option,com_sobi2/"
def get_links(func):
linklist = []
res = requests.get(func())
soup = BeautifulSoup(res.text,"lxml")
for item in soup.select(".sobi2ItemTitle a"):
linklist.append(urljoin(url,item.get("href")))
#print(linklist)
return linklist
def get_target_link():
return func() #All I need to do is fix this line
return get_target_link
@get_links
def get_info():
res = requests.get(url)
soup = BeautifulSoup(res.text,"lxml")
for items in soup.select("#sobi2CatListSymbols .sobi2SubcatsListItems a[title]"):
if items.text=="Tutors":
ilink = f"{urljoin(url,items.get('href'))}"
return ilink
if __name__ == '__main__':
for links in get_info():
print(links)
Post Script: I only would like to comply with the logic I've tried to apply above.
@sir Andersson (Can you explain how you want to re-use them if necessary) 的更新:
def get_target_link():
titles = []
new_links = func()
for new_link in new_links:
res = requests.get(new_link)
soup = BeautifulSoup(res.text)
titles.append(soup.select_one("h1").text)
return titles
return get_target_link
我想创建装饰函数,使其类似于@Carlos Mermingas:
import requests
from urllib.parse import urljoin
from bs4 import BeautifulSoup
url = "https://www.janglo.net/component/option,com_sobi2/"
def get_info(link):
res = requests.get(url)
soup = BeautifulSoup(res.text,"lxml")
for items in soup.select("#sobi2CatListSymbols .sobi2SubcatsListItems a[title]"):
if items.text=="Tutors":
ilink = f"{urljoin(url,items.get('href'))}"
return ilink
def get_links(tlink):
linklist = []
res = requests.get(tlink)
soup = BeautifulSoup(res.text,"lxml")
for item in soup.select(".sobi2ItemTitle a"):
linklist.append(urljoin(url,item.get("href")))
return linklist
def get_target_link(link):
titles = []
res = requests.get(link)
soup = BeautifulSoup(res.text,"lxml")
titles.append(soup.select_one("h1").text)
return titles
if __name__ == '__main__':
item = get_info(url)
for nlink in get_links(item):
for ititle in get_target_link(nlink):
print(ititle)
【问题讨论】:
-
您能否解释一下您希望如何在必要时重复使用它们?您想重用装饰器中定义的变量吗?为什么不只创建返回此链接列表的单独函数?
-
为什么你必须或想要使用装饰器?也许如果您发布对您有用的“常规方法”,将会阐明您的意图。此外,我发现您当前的
get_links实现存在一些问题:1) 它两次调用装饰函数 (func()) 和 2) 它返回一个列表而不是可调用函数 (return linklist)。 -
查看更新@sir Andersson。
-
问题已编辑以表明我的意图@Carlos Mermingas。
-
感谢您发布原始代码。我仍然不清楚装饰器如何解决这里的问题。
标签: python python-3.x function web-scraping decorator