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