无法在方法之间传递变量作为参数

时间:2019-06-11 11:02:46

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

我已经使用 class 在python中创建了一个脚本,以使用我的凭据登录网站。运行脚本时,我可以看到它已成功登录。我无法做的是找到一种合适的方法,将res.text方法中返回的login()传递给get_data()方法,因此我可以进一步处理它。我不想尝试这样的return self.get_data(res.text),因为它看起来很尴尬。

最重要的是:当我运行脚本时,它将像现在一样自动登录。但是,当我在主函数中使用此行scraper.get_data()时,它将获取数据。

这是我到目前为止的尝试:

from lxml.html import fromstring
import requests

class CoffeeGuideBot(object):

    login_url = "some url"

    def __init__(self,session,username,password):
        self.session = session
        self.usrname = username
        self.password = password
        self.login(session,username,password)

    def login(self,session,username,password):
        session.headers['User-Agent'] = 'Mozilla/5.0'
        payload = {
            "Login1$UserName": username, 
            "Login1$Password": password, 
            "Login1$LoginButton": "Log on"
        }
        res = session.post(self.login_url,data=payload)
        return res.text

    def get_data(self,htmlcontent):
        root = fromstring(htmlcontent,"lxml")
        for iteminfo in root.cssselect("some selector"):
            print(iteminfo.text)

if __name__ == '__main__':
    session = requests.Session()
    scraper = CoffeeGuideBot(session,"username","password")
    #scraper.get_data() #This is how i wish to call this

在方法之间传递变量作为参数的理想方法是什么?

2 个答案:

答案 0 :(得分:3)

如果我正确理解了您的要求,则希望在res.text内部访问get_data(),而无需将其作为方法参数传递。

IMO有2个选项。

  1. res存储为CoffeeGuideBot的类实例变量,并在get_data()中访问它
def login(self,session,username,password):
    <some code>
    self.res = session.post(self.login_url,data=payload) 

def get_data(self):
    root = fromstring(self.res.text,"lxml")
    <other code>
  1. 与上面几乎相同,但是实际上使用login()的返回值来存储res。在当前代码中,return语句是不必要的。
def __init__(self,session,username,password):
    <initializations>
    self.res = self.login(session,username,password)

def login(self,session,username,password):
    <some code>
    return session.post(self.login_url,data=payload)

def get_data(self):
    root = fromstring(self.res.text,"lxml")
    <other code>

答案 1 :(得分:1)

from lxml.html import fromstring
import requests

class CoffeeGuideBot(object):

    login_url = "some url"

    def __init__(self,session,username,password):
        self.session = session
        self.usrname = username
        self.password = password
        self._login = self.login(session,username,password)

    def login(self,session,username,password):
        session.headers['User-Agent'] = 'Mozilla/5.0'
        payload = {
            "Login1$UserName": username, 
            "Login1$Password": password, 
            "Login1$LoginButton": "Log on"
        }
        res = session.post(self.login_url,data=payload)
        return res.text

    def get_data(self):
        htmlcontent = self._login
        root = fromstring(htmlcontent,"lxml")
        for iteminfo in root.cssselect("some selector"):
            print(iteminfo.text)

if __name__ == '__main__':
    session = requests.Session()
    scraper = CoffeeGuideBot(session,"username","password")
    scraper.get_data()