11月10日python爬蟲分析網頁的模組lxml和Beautiful Soup
unicode是字符集,不是編碼方式
ajax返回的是json字串,json字元是類字典的形式,裡面是鍵值對
format自動排列
# 定義檔案儲存的位置,原始的定義要改變的地方是定義在字串中的
fileName = 'g:/spider/poetry/poetry{0}.html'
f = open(fileName.format(z), "wb")
for 迴圈的結果如果在外邊列印的話只能列印最後一個結果,如果想列印全部的話必須要把print放在for迴圈裡面
使用requests獲得網頁物件html之後,如果亂碼:
1. html.encoding = 'gb2312' # 將下載結果用gb2312編碼
print(html.text) # 然後以文字的形式打印出來
2. html = r.content # 先將下載的返回結果轉換成二進位制
html =str(html, "gb2312") # 然後轉換成以gb2312編碼字串
print(html)
lxml和Beautiful Soup都是用於解析網頁的第三方模組, lxml比Beautiful Soup解析速度更快,並且lxml是用C語言編寫的,Python 標準庫中自帶了 xml 模組,但是效能不夠好,而且缺乏一些人性化的 API, 相比之下,第三方庫 lxml 是用 Cython 實現的,而且增加了很多實用的功能,可謂爬蟲處理網頁資料的一件利器
lxml 大部分功能都存在 lxml.etree中
Beautiful Soup的用法:
1.先轉換成soup物件,然後可以用find(只返回一個)和find_all(返回所有)進行匹配
from bs4 import BeautifulSoup
broken_html ='<ul class=country> <li>Area</li> <li>Population</ul>'
soup = BeautifulSoup(broken_html,'html.parser')
fixed_html = soup.prettify()
print(fixed_html)
ul = soup.find('ul', attrs={'class': 'country'})
print(ul)
print(ul.find('li')) # 只返回第一個
print(ul.find_all('li'))
lxml的用法:
網頁下載下來以後是個字串的形式,如果是一個破損的程式碼,可以用一下的方式補全:
import lxml.html
broben_html = "<ul class=country> <li>Area <li>Population</ul>"
tree = lxml.html.fromstring(broben_html)
fixed_html = lxml.html.tostring(tree,pretty_print=True)
print(fixed_html)
使用etree.fromstring(str)構造一個 etree._ElementTree物件
使用 etree.tostring(t)返回一個字串
lxml是python的一個解析庫,支援HTML和XML的解析,支援XPath解析方式,而且解析效率非常高
lxml支援兩種查詢資訊方式:xpath和css選擇器
XPath,全稱XML Path Language,即XML路徑語言,它是一門在XML文件中查詢資訊的語言,它最初是用來搜尋XML文件的,但是它同樣適用於HTML文件的搜尋
XPath 使用路徑表示式來選取 XML 文件中的節點或節點集。節點是通過沿著路徑 (path) 或者步 (steps) 來選取的。
/text() 是用來讀取內容的
XPath 實在太強大了,在定位元素方面絕對是秒殺 CSS 選擇器
css選擇器:
基本和CSS選擇器的用法一樣
div p 是選擇<div>元素內的所有<p>元素
div > p 是選擇<div>元素下的直接子元素p