Python Can';t使用由我的scraper中的方法生成的链接

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条件,以便

我对用python编写和使用类非常陌生。我已经编写了一个解析器,使用类来检查是否存在由
生成的
下一页
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)
in
if else
block是使其循环运行的修复方法。关于缩进的一个小问题:如果我使用
return link
左一个选项卡(而不是您所做的),我会得到相同的结果。我应该走哪条路?谢谢,不用了。实际上,你不会得到同样的结果。如果nurl
返回
True
,则它在
时工作,但如果它返回
False
,则
link=self。get_nextpage(soup)
将不执行,并且
返回链接
行将导致
名称错误
。但您可以执行
其他操作:link=“”
。在这种情况下,可以移动
返回链接