爬虫学习笔记(五)——网页解析工具(bs4、xpath)
生活随笔
收集整理的這篇文章主要介紹了
爬虫学习笔记(五)——网页解析工具(bs4、xpath)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、BS4
1.1、前沿
BeautifulSoup 是一個可以從HTML或XML文件中提取數據的Python庫,它的使用方式相對于正則來說更加的簡單方便,常常能夠節省我們大量的時間。(我這里只是簡單介紹bs4使用,想了解更多的小伙伴可以參考:官方中文文檔)
安裝
pip install beautifulsoup4解析器
| Python標準庫 | BeautifulSoup(markup, “html.parser”) | Python的內置標準庫執行速度適中文檔容錯能力強 | Python 2.7.3 or 3.2.2)前 的版本中文檔容錯能力差 |
| lxml HTML 解析器 | BeautifulSoup(markup, “lxml”) | 速度快文檔容錯能力強 | 需要安裝C語言庫 |
| lxml XML 解析器 | BeautifulSoup(markup, [“lxml”, “xml”]),BeautifulSoup(markup, “xml”) | 速度快唯一支持XML的解析器 | 需要安裝C語言庫 |
| html5lib | BeautifulSoup(markup, “html5lib”) | 最好的容錯性以瀏覽器的方式解析文檔生成HTML5格式的文檔 | 速度慢不依賴外部擴展 |
由于這個解析的過程在大規模的爬取中是會影響到整個爬蟲系統的速度的,所以推薦使用的是lxml,速度會快很多,而lxml需要單獨安裝:pip install lxml
提示:如果一段HTML或XML文檔格式不正確的話,那么在不同的解析器中返回的結果可能是不一樣的,所以要指定某一個解析器。
基本語法
(往下的示例均以下面的這個HTML代碼作為案例) html_str="""<!DOCTYPE html> <html> <head> <title>爬蟲</title><meta charset="utf-8"><link rel="stylesheet" href="http://www.taobao.com"><link rel="stylesheet" href="https://www.baidu.com"><link rel="stylesheet" href="http://at.alicdn.com/t/font_684044_un7umbuwwfp.css"> </head> <body> <!-- footer start --> <footer id="footer"><div class="footer-box"><div class="footer-content" ><p class="top-content" id="111"><a href="http://www.taobao.com">淘寶</a> <span class="link"><a class="product" href="https://www.baidu.com">關于Python</a> <a href="http://www.taobao.com">好好學習</a> <a href="javascript:void(0)">人生苦短</a> <a href="javascript:void(0)">我用Python</a></span><span class="about-me">關于我: <i class="PyWhich py-wechat"></i> 忽略</span></p><p class="bottom-content"><span>地址: xxxx</span><span>聯系方式: <a href="tel:400-1567-315">400-1567-315</a> (24小時在線)</span></p></div><p class="copyright-desc">Copyright © 爬蟲有限公司. All Rights Reserved</p></div> </footer></body> </html> """ from bs4 import BeautifulSoup#導包 soup=BeautifulSoup(html_str,'lxml') #html_str:HTML代碼 type(soup) #結果:bs4.BeautifulSoup1.2、獲取標簽
格式:soup.標簽 (注意這里的soup是上面初始化的)
示例:
soup.a #獲取第一個符合條件的標簽 #結果: <a href="http://www.taobao.com">淘寶</a>1.3、獲取標屬性
格式:soup.標簽['屬性名']
示例:
1.4、獲取內容
格式:soup.標簽.text
示例:
1.5、親戚標簽的選擇
(有興趣的自己去運行下,我這里就不運行了)
示例:
1.6、find_all
def find_all(name=None, attrs={}, recursive=True, text=None):#作用:查找元素 返回值是存儲在列表中#name 標簽名字#attrs 屬性#recursive 遞歸 只能獲取到 子元素#text 標簽內容pass示例:
a=soup.find_all("a",text="淘寶")#根據標簽名查找所有元素 標簽內容 篩選定位元素 print(a) #結果: [<a href="http://www.taobao.com">淘寶</a>] p=soup.find_all("p",attrs={"class":"top-content"})#名字 屬性定位 元素 html=soup.find_all("html",recursive=False)#只獲取子元素1.7、CSS選擇器
示例:
soup.select("p") #根據名字獲取所有元素soup.select("p > span") #獲取所有p標簽下 所有的子代span元素 soup.select("p span") #獲取所有p標簽下 所有的span元素 soup.select('.top-content') #獲取class為top-content的元素 soup.select('#111') #獲取id為111 的元素二、Xpath
基本語法
from lxml import etree #導包 page=etree.HTML(html_str) #結果:<Element html at 0x27ed6712cc8>2.1、標簽選擇與屬性值的選擇
示例:
page.xpath('/html/body') #從根路徑開始,層層篩選 /:表示下一級的元素 #結果:[<Element body at 0x163035a6b80>]p=page.xpath("//p") #獲取所有p標簽元素 存在列表中 p[0].xpath('./a') # . : 表示當前元素標簽 #結果:[<Element a at 0x1630358ff00>]a=page.xpath("//a")[0] a.xpath('..') #.. :當前節點的父節點page.xpath("body")#根據標簽名字 獲取元素 只能拿到子標簽 #[<Element body at 0x163035a6b80>] p=page.xpath('//p[@class="top-content"]')#根據屬性獲取標簽 #[<Element p at 0x27ed684a948>]attr_value=page.xpath('//p[@class="bottom-content"]/span') #獲取標簽屬性值 # [<Element span at 0x16303589dc0>, <Element span at 0x16303596640>]page.xpath("//*") #獲取所有標簽元素tags=page.xpath('//p[@class="top-content"]/a[1]') #xpath 規則 從1開始 #[<Element a at 0x27ed6712f08>]2.2、獲取文本
示例:
contents=page.xpath("//p/a/text()") #獲取標簽內容 在列表中 # ['淘寶', '關于Python', '好好學習', '人生苦短', '我用Python', '優秀']con_all=page.xpath("string(//html)")#獲取標簽下所有內容2.3、語法總結
- 常用
XPath 使用路徑表達式在 XML/HTML 文檔中選取節點。節點是通過沿著路徑或者 step 來選取的。
下面列出了最有用的路徑表達式:
| nodename | 選取當前節點的所有nodename子節點 |
| / | 從根節點選取 |
| // | 從匹配選擇的當前節點選擇文檔中的節點,而不考慮它們的位置。 |
| . | 選取當前節點 |
| .. | 選取當前節點的父節點 |
| @ | 選取屬性 |
- 謂語
謂語用來查找某個或某些特定的節點或者包含某個指定值的節點謂語被嵌在方括號中。
實例:
在下面的表格中,我們列出了帶有謂語的一些路徑表達式,以及表達式的結果。
| //bookstore/book[1] | 選取屬于 bookstore 子元素的第一個 book 元素。 |
| //bookstore/book[last()] | 選取屬于 bookstore 子元素的最后一個 book 元素。 |
| //bookstore/book[last()-1] | 選取屬于 bookstore 子元素的倒數第二個 book 元素。 |
| //bookstore/book[position() < 3] | 選取最前面的兩個屬于 bookstore 元素的子元素的 book 元素。 |
| //title[@lang] | 選取所有擁有名為 lang 的屬性的 title 元素。 |
| //title[@lang=‘eng’] | 選取所有 title 元素,且這些元素擁有值為 eng 的 lang 屬性。 |
| //bookstore/book[price>35.00] | 選取 bookstore 元素的所有 book 元素,且其中的 price 元素的值須大于 35.00。 |
| //bookstore/book[price>35.00]/title | 選取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值須大于 35.00。 |
- Xpath通配符,選取未知節點
| * | 匹配任何元素節點 | //bookstore/* | 選取bookstore元素的所有子元素。 |
| @* | 匹配任何屬性節點 | //* | 選取文檔中國的所有元素 |
| node() | 匹配任何類型的節點 | //title[@*] | 選取所有帶有屬性的title元素 |
三、小案例:TOP250電影信息(首頁)
3.1、requests + bs4
import requests from bs4 import BeautifulSoupurl = 'https://movie.douban.com/top250' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36 Edg/91.0.864.48'} res = requests.get(url,headers=headers)soup = BeautifulSoup(res.text,'lxml')boxs = soup.select('.info') for box in boxs:film_name = box.select('.hd a .title')[0].textprint('電影名稱:', film_name, end=' ')score = box.select('.bd .star .rating_num')[0].textprint('評分:', score, end=' ')director = box.select('.bd p')[0].text.strip().split('\n')[0]print('導演:', director)結果:
3.2、requests + xpath
import requests from lxml import etreeurl = 'https://movie.douban.com/top250' headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.101 Safari/537.36 Edg/91.0.864.48'}res = requests.get(url,headers=headers)html = etree.HTML(res.text) boxs = html.xpath('//div[@class="info"]')for box in boxs:film_name = box.xpath('./div/a/span[1]/text()')[0]print('電影名稱:', film_name, end=' ')score = box.xpath('./div/div/span[2]/text()')[0]print('評分:', score, end=' ')director = box.xpath('./div/p/text()')[0].strip()print('導演:', director)結果:
總結
以上是生活随笔為你收集整理的爬虫学习笔记(五)——网页解析工具(bs4、xpath)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: UnicodeDecodeError:
- 下一篇: 爬虫学习笔记(七)——Scrapy框架(