python - 无法使用我的抓取工具中的方法生成的链接

标签 python python-3.x class web-scraping

我对于用 python 编写和使用类还很陌生。我已经使用类编写了一个解析器来检查是否存在由 .get_nextpage() 方法生成的 next page url。但是,当 .get_nextpage() 方法生成链接时,应在 try except block 中的 self.get_nextpage(soup) 行之后打印该链接在 .get_links() 方法中。我被困在这里,不知道如何才能使它成为可能。

没有其他解决方案是我所追求的。我只是想知道逻辑,如果我可以尝试的话。

我在 .get_links() 方法中使用了 while True 条件,以便它将运行,直到 .get_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

然后你就可以在 get_links() 中使用它获取链接值:

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

请注意if/else使用而不是 try/except作为没有显式的方法/函数 return返回Nonetry: None永远不会生成异常和循环break不会被执行

关于python - 无法使用我的抓取工具中的方法生成的链接,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51172489/

相关文章:

Python:如何通过下一个项目值链接列表中的元组

c# - 交换类实例数组中的值

c++ - 在 Objective C 中前向声明命名空间 C++ 类

Python:如何用 < 和 > 将字符串括在列表中

python - 如何从包含单行所有关系的csv文件中获取关系数据?

Python 3.5 全局变量不会追加

python - 如何让文本对象与 sklearn 分类器管道一起工作?

java - 如何将值传递回 Java 中的类?

python - String 的子类在调用时将参数绑定(bind)到 __init__? 的两个参数。

python - 无法导入 numpy