import requests
import bs4
from bs4 import beautifulsoup
defgethtmltext
(url)
:try
: r = requests.get(url, timeout=30)
r.raise_for_status(
) return r.text
except
:return
''def
fillunivlist
(ulist, html)
: soup = beautifulsoup(html,
'html.parser'
)for tr in soup.find(
'tbody'
).children:
ifisinstance
(tr, bs4.element.tag)
: tds = tr(
'td'
)[tds[0]
.string, tds[1]
.string, tds[4]
.string]
)def
printunivlist
(ulist, num)
: tplt =
"\t^10}\t"
print
(tplt.
format
('排名'
,'學校名稱'
,'總分'
,chr
(12288))
)for i in
range
(num)
: u = ulist[i]
print
(tplt.
format
(u[0
], u[1]
, u[2]
,chr
(12288))
)def
main()
: uinfo =
url =
''html = gethtmltext(url)
fillunivlist(uinfo, html)
printunivlist(uinfo,35)
# 20 univs
main(
)
錯誤資訊如下:
traceback (most recent call last):
file "e:/code/python/爬蟲/python網路爬蟲與資訊提取/第二週/test.py", line 35, in
main(
) file "e:/code/python/爬蟲/python網路爬蟲與資訊提取/第二週/test.py", line 33, in main
printunivlist(uinfo, 35)
# 20 univs
file "e:/code/python/爬蟲/python網路爬蟲與資訊提取/第二週/test.py", line 26, in printunivlist
print(tplt.format(u[0], u[1], u[2], chr(12288))
)typeerror: unsupported format string passed to nonetype.__format__
錯誤
用 .string 屬性來提取標籤裡的內容時,該標籤應該是只有單個節點的。string方法不能處理標籤中含有標籤的內容,否則返回為none。
而從網頁源**中可以看出,所要提取的資訊都在巢狀在標籤之間的
使用.text或者.get_text()方法獲取資訊即可,**修改如下:
def
fillunivlist
(ulist, html)
: soup = beautifulsoup(html,
'html.parser'
)for tr in soup.find(
'tbody'
).children:
ifisinstance
(tr, bs4.element.tag)
: tds = tr(
'td'
)[tds[0]
.text, tds[1]
.text, tds[4]
.text]
)
可以看到如下的輸出
但是格式並和預期並不一致,這是為什麼呢?
從原始碼中得知,我們提取的資訊包含很多多餘的空格字元,使用strip()函式去掉即可
參考:
中國大學排名定向爬蟲
功能描述 輸入 大學排名url鏈結 輸出 大學排名資訊的螢幕輸出 排名,大學名稱,總分 技術路線 requests bs4 定向爬蟲 僅對輸入url進行爬取,不擴充套件爬取 程式的結構設計 步驟1 從網路上獲取大學排名網頁內容 gethtmltext 步驟2 提取網頁內容中資訊到合適的資料結構 fi...
爬蟲例項(中國大學排名定向排名)
功能 輸出 大學排名資訊的螢幕輸出 排名,大學名稱,總分 技術路線 requests bs4 定向爬蟲 僅對輸入的url進行爬取,不擴充套件爬取 步驟 1.從網路上獲取大學排名網頁內容 2.提取網頁中資訊到合適的資料結構 3.利用資料結構展示並輸出結果 程式的結構設計 1.從網路上獲取大學排名網頁內...
中國大學排名定向爬蟲例項
第乙個大學 第n個大學 import requests from bs4 import beautifulsoup import bs4 def gethtmltext url 輸入url,返回html try r requests.get url,timeout 30 r.raise for st...