Python Can';t使用由我的scraper中的方法生成的链接
我对用python编写和使用类非常陌生。我已经编写了一个解析器,使用类来检查是否存在由Python Can';t使用由我的scraper中的方法生成的链接,python,python-3.x,class,web-scraping,Python,Python 3.x,Class,Web Scraping,我对用python编写和使用类非常陌生。我已经编写了一个解析器,使用类来检查是否存在由生成的下一页url。get\u nextpage()方法。但是,当.get\u nextpage()方法生成链接时,它应该在self.get\u nextpage(soup)中的行之后打印。请尝试中的除块。get\u links()方法。我被困在这里,不知道如何才能使之成为可能 我所追求的不是别的解决办法。如果我能试一下,我只想知道逻辑 我在.get\u links()方法中使用了while True条件,以便
生成的下一页
url。get\u nextpage()
方法。但是,当.get\u nextpage()
方法生成链接时,它应该在self.get\u nextpage(soup)
中的行之后打印。请尝试中的除块。get\u links()
方法。我被困在这里,不知道如何才能使之成为可能
我所追求的不是别的解决办法。如果我能试一下,我只想知道逻辑
我在.get\u links()
方法中使用了while True
条件,以便它将一直运行,直到.get\u nextpage()
方法生成新链接为止。(这不是问题的一部分。只是想让你知道我为什么在那里使用“while True”
)
这是铲运机:
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
您可以修改您的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
然后您可以在获取链接()
中使用它来获取链接值:
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
请注意,如果使用/else
而不是try
/作为方法/函数,但没有显式的返回返回无
和try:None
将永远不会生成异常,并且不会执行循环中断
,您不会从中返回任何内容获取下一页
。您是否打算返回链接
?尝试在get\u nextpage
定义(在if
块中)的末尾添加返回链接
。也可以用替换try:self.get\nextpage(soup)
如果self.get\nextpage(soup)
和除了:break
替换为否则:break
@Andersson您应该将此作为一个答案重新发布。我将非常荣幸地接受您的解决方案@sir Andersson。是的,那是个错误,我什么都没退。但是,self.url=self.get_nextpage(soup)
inif else
block是使其循环运行的修复方法。关于缩进的一个小问题:如果我使用return link
左一个选项卡(而不是您所做的),我会得到相同的结果。我应该走哪条路?谢谢,不用了。实际上,你不会得到同样的结果。如果nurl
返回True
,则它在时工作,但如果它返回False
,则link=self。get_nextpage(soup)
将不执行,并且返回链接
行将导致名称错误
。但您可以执行其他操作:link=“”
。在这种情况下,可以移动返回链接