用python爬取豆瓣纸书,先来代码:
from bs4 import BeautifulSoup
import bs4
import requests
def getHtmlText(url):
try:
r=requests.get(url,timeout=30)
r.raise_for_status()
r.encodin=r.apparent_encoding
return r.text
except:
return ""
def fillBookList(BookList,html):
soup=BeautifulSoup(html,'html.parser')
ul=soup.find('div','tab-list book-show-wrap').ul
for li in ul.children:
if isinstance(li,bs4.element.Tag):
BookList.append(li.find('h3').string)
def printBookList(BookList,num):
tple="{0:{1}^10}"
print(tple.format('书籍',chr(12288)))
for i in range(num):
print(tple.format(BookList[i],chr(12288)))
def main():
book=[]
url='https://market.douban.com/book/?platform=web&channel=book_nav&page=1&page_num=20&'
html=getHtmlText(url)
fillBookList(book,html)
printBookList(book,20)
main()
中间有两个注意点,第一个时要注意找各种子节点时要分析html源码,第一次写的时候,随便找了个ul,但html中有很多ul,这时就要找到 div的ul再往下推,其次,需要判断li是不是一个Tag,之后才是得到string。
第二个是输出问题,为了是输出更美观,应该用str.format方法,其中特别是中文空格和西文空格占的宽度不一样,如果前面的东西都是中文,空格也应该是用中文空格来使得居中,对齐变得更加美观
空格默认为西文空格,中文空格代码为 chr(12288)
format方法小结:
#输出基本用法
print(‘{0},{1}’.format(‘zhangk’, 32))
print('{},{},{}'.format('zhangk','boy',32))
print('{name},{sex},{age}'.format(age=32,sex='male',name='zhangk'))
# 格式限定符
# 它有着丰富的的“格式限定符”(语法是{}中带:号),比如:
# 填充与对齐
# 填充常跟对齐一起使用
# ^、<、>分别是居中、左对齐、右对齐,后面带宽度
# :号后面带填充的字符,只能是一个字符,不指定的话默认是用空格填充,,可改为中文空格
print('{:>8}'.format('zhang'))
print('{:0>8}'.format('zhang'))
print('{:a<8}'.format('zhang'))
print('{:p^10}'.format('zhang'))
# 精度与类型f
# 精度常跟类型f一起使用
print('{:.2f}'.format(31.31412))
# 其他类型
# 主要就是进制了,b、d、o、x分别是二进制、十进制、八进制、十六进制
print('{:b}'.format(15))
print('{:d}'.format(15))
print('{:o}'.format(15))
print('{:x}'.format(15))
# 用逗号还能用来做金额的千位分隔符
print('{:,}'.format(123456789))