python得到所有在leetcode上Accepted的代码(一)

得到cookies

要得到所有提交成功的代码,必须先登录你的账号,得到你的cookies,这点我已经在先前的博文python 模拟登陆leetcode中详细讲述了。

    url = "https://leetcode.com/submissions/"
    res = s.get(url=url,headers=headers_base,cookies=login())
    content = bs(res.text)//s是requests.session对象

这里得到的content也就是显示你所有在leetcode上提交历史的界面,对于网页中内容的提取,我们继续采用beautifulsoup库。

得到描述代码的网址

观察网页源码,发现你的每次提交历史都在一个tr标签

这里写图片描述
我们分析其中一个标签,发现它又包括了多个td标签,分别代表提交距今日时间,空行,题目名称,空行,是否成功,空行,用时,空行,何种语言。我们需要的内容,代表是否提交成功,以及代码网址都在第三个标签中。
之前已经说了使用beautifulsoup非常简单,不需费力匹配正则,直接使用标签名称就可以

    infos = content.find_all("tr")

这里是获得网页中所有的tr标签,是否成功标识在网页中是个字符串,我们可以使用遍历tr.strings标签中所有的字符串

    for i in infos:
        for j in i.strings:
            if j=="Accepted":
                print i

这里打印出来会有很多空格,可以使用tag.stripped_strings去除空格。

    for i in infos:
        for j in i.stripped_strings:
            if j=="Accepted":
                print i

我们获得了所有描述提交成功的tr标签,下一步就是在tr标签中提取代码网址,tag的 .contents 属性可以将tag的子节点以列表的方式输出,这样就可以得到具体描述网址信息的td标签了

    for i in infos:
        for j in i.stripped_strings:
            if j=="Accepted":
                print i.contents[3]

其中一个输出是

<td>
<a class="inline-wrap" href="/problems/counting-bits/">Counting Bits</a>
</td>

即,网址信息是在td标签中的子节点a中的href属性中

    for i in infos:
        for j in i.stripped_strings:
            if j=="Accepted":
                # for k in i.contents:
                #     print k
                print i.contents[5].a["href"]

在前面加上 https://leetcode.com/,即为代码界面
其实获得这个网址信息,还有一个更简单的方法,
这里写图片描述

更简单的方法

观察,网页源代码,我们发现网址信息是在一个有class href属性的a标签的字节点中,beautifulsoup有个方法:
find_all( name , attrs , recursive , text , **kwargs )

find_all() 方法搜索当前tag的所有tag子节点,并判断是否符合过滤器的条件,这样上面的代码只需下面三行:

    content = bs(res.text)
    for i in content.find_all("a","text-danger status-accepted"):
        print i["href"]

好,我们得到了描述代码的网址信息,接下来就是在该网址中得到代码了。笔者仔细看了一下该网页的源代码,竟没有找到描述提交代码的节点,后来发现是使用css的伪类,隐藏了那部分源码,这种情况,笔者也是第一次遇到,该如何处理,请关注下篇。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值