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的僞類,隱藏了那部分源碼,這種情況,筆者也是第一次遇到,該如何處理,請關注下篇。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章