python beautiful soup 标签完全相同_Python爬取Python教程并制作成pdf
歡迎點(diǎn)擊右上角關(guān)注小編,除了分享技術(shù)文章之外還有很多福利,私信學(xué)習(xí)資料可以領(lǐng)取包括不限于Python實(shí)戰(zhàn)演練、PDF電子文檔、面試集錦、學(xué)習(xí)資料等。
想要把教程變成PDF有三步:
1、先生成空html,爬取每一篇教程放進(jìn)一個(gè)新生成的div,這樣就生成了包含所有教程的html文件(BeautifulSoup)
2、將html轉(zhuǎn)換成pdf(wkhtmltopdf)
3、由于反爬做的比較好,在爬取的過程中還需要代理ip(免費(fèi) or 付費(fèi))
開始使用
將一段文檔傳入 BeautifulSoup 的構(gòu)造方法,就能得到一個(gè)文檔的對象, 可以傳入一段字符串或一個(gè)文件句柄.
如下所示:
首先,文檔被轉(zhuǎn)換成Unicode,并且HTML的實(shí)例都被轉(zhuǎn)換成Unicode編碼.
然后,Beautiful Soup選擇最合適的解析器來解析這段文檔,如果手動指定解析器那么Beautiful Soup會選擇指定的解析器來解析文檔.
對象的種類
Beautiful Soup 將復(fù)雜 HTML 文檔轉(zhuǎn)換成一個(gè)復(fù)雜的樹形結(jié)構(gòu),每個(gè)節(jié)點(diǎn)都是 Python 對象,所有對象可以歸納為 4 種: Tag , NavigableString , BeautifulSoup , Comment .
Tag:通俗點(diǎn)講就是 HTML 中的一個(gè)個(gè)標(biāo)簽,類似 div,p。
NavigableString:獲取標(biāo)簽內(nèi)部的文字,如,soup.p.string。
BeautifulSoup:表示一個(gè)文檔的全部內(nèi)容。
Comment:Comment 對象是一個(gè)特殊類型的 NavigableString 對象,其輸出的內(nèi)容不包括注釋符號.
Tag
Tag就是html中的一個(gè)標(biāo)簽,用BeautifulSoup就能解析出來Tag的具體內(nèi)容,具體的格式為soup.name,其中name是html下的標(biāo)簽,具體實(shí)例如下:
print soup.title輸出title標(biāo)簽下的內(nèi)容,包括此標(biāo)簽,這個(gè)將會輸出
print soup.head輸出head標(biāo)簽下的內(nèi)容
如果 Tag 對象要獲取的標(biāo)簽有多個(gè)的話,它只會返回所以內(nèi)容中第一個(gè)符合要求的標(biāo)簽。
Tag 屬性
每個(gè) Tag 有兩個(gè)重要的屬性 name 和 attrs:
name:對于Tag,它的name就是其本身,如soup.p.name就是p
attrs是一個(gè)字典類型的,對應(yīng)的是屬性-值,如print soup.p.attrs,輸出的就是{'class': ['title'], 'name': 'dromouse'},當(dāng)然你也可以得到具體的值,如print soup.p.attrs['class'],輸出的就是[title]是一個(gè)列表的類型,因?yàn)橐粋€(gè)屬性可能對應(yīng)多個(gè)值,當(dāng)然你也可以通過get方法得到屬性的,如:print soup.p.get('class')。還可以直接使用print soup.p['class']
get
get方法用于得到標(biāo)簽下的屬性值,注意這是一個(gè)重要的方法,在許多場合都能用到,比如你要得到標(biāo)簽下的圖像url,那么就可以用soup.img.get('src'),具體解析如下:
# 得到第一個(gè)p標(biāo)簽下的src屬性printsoup.p.get("class")
string
得到標(biāo)簽下的文本內(nèi)容,只有在此標(biāo)簽下沒有子標(biāo)簽,或者只有一個(gè)子標(biāo)簽的情況下才能返回其中的內(nèi)容,否則返回的是None具體實(shí)例如下:
# 在上面的一段文本中p標(biāo)簽沒有子標(biāo)簽,因此能夠正確返回文本的內(nèi)容printsoup.p.string# 這里得到的就是None,因?yàn)檫@里的html中有很多的子標(biāo)簽printsoup.html.string
get_text()
可以獲得一個(gè)標(biāo)簽中的所有文本內(nèi)容,包括子孫節(jié)點(diǎn)的內(nèi)容,這是最常用的方法。
搜索文檔樹
BeautifulSoup 主要用來遍歷子節(jié)點(diǎn)及子節(jié)點(diǎn)的屬性,通過Tag取屬性的方式只能獲得當(dāng)前文檔中的第一個(gè) tag,例如,soup.p。如果想要得到所有的
標(biāo)簽,或是通過名字得到比一個(gè) tag 更多的內(nèi)容的時(shí)候,就需要用到 find_all()
find_all(name, attrs, recursive, text, **kwargs )
find_all是用于搜索節(jié)點(diǎn)中所有符合過濾條件的節(jié)點(diǎn)。
name參數(shù):是Tag的名字,如p,div,title
# 1. 節(jié)點(diǎn)名print(soup.find_all('p'))# 2. 正則表達(dá)式print(soup.find_all(re.compile('^p')))# 3. 列表 print(soup.find_all(['p','a']))
另外 attrs 參數(shù)可以也作為過濾條件來獲取內(nèi)容,而 limit 參數(shù)是限制返回的條數(shù)。
CSS 選擇器
以 CSS 語法為匹配標(biāo)準(zhǔn)找到 Tag。同樣也是使用到一個(gè)函數(shù),該函數(shù)為select(),返回類型是 list。它的具體用法如下:
# 1. 通過 tag 標(biāo)簽查找print(soup.select(head))# 2. 通過 id 查找print(soup.select('#link1'))# 3. 通過 class 查找print(soup.select('.sister'))# 4. 通過屬性查找print(soup.select('p[name=dromouse]'))# 5. 組合查找print(soup.select("body p"))
wkhtmltopdf
wkhtmltopdf主要用于HTML生成PDF。
pdfkit是基于wkhtmltopdf的python封裝,支持URL,本地文件,文本內(nèi)容到PDF的轉(zhuǎn)換,其最終還是調(diào)用wkhtmltopdf命令。
安裝
先安裝wkhtmltopdf,再安裝pdfkit。
https://wkhtmltopdf.org/downloads.html
pdfkit
shell pip3 install pdfkit
轉(zhuǎn)換url/file/string
importpdfkitpdfkit.from_url('http://google.com','out.pdf')pdfkit.from_file('index.html','out.pdf')pdfkit.from_string('Hello!','out.pdf')
轉(zhuǎn)換url或者文件名列表
pdfkit.from_url(['google.com','baidu.com'],'out.pdf')pdfkit.from_file(['file1.html','file2.html'],'out.pdf')
轉(zhuǎn)換打開文件
withopen('file.html')asf: pdfkit.from_file(f,'out.pdf')
自定義設(shè)置
使用代理ip
爬取十幾篇教程之后觸發(fā)了這個(gè)錯誤:
看來廖大的反爬蟲做的很好,于是只好使用代理ip了,嘗試了免費(fèi)的西刺免費(fèi)代理后,最后選擇了付費(fèi)的 阿布云 ,感覺響應(yīng)速度和穩(wěn)定性還OK。
運(yùn)行結(jié)果
運(yùn)行過程截圖:
運(yùn)行過程
生成的效果圖:
效果圖
代碼如下:
總結(jié)
以上是生活随笔為你收集整理的python beautiful soup 标签完全相同_Python爬取Python教程并制作成pdf的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 云闪付乘车优惠时间!2019云闪付一分钱
- 下一篇: python计算小数点后有几位_pyth