pathon爬取豆瓣纸书

用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))
    原文作者:有苦向瓜诉说
    原文地址: https://www.jianshu.com/p/9fff05cf68d4
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞