整合營銷服務商

          電腦端+手機端+微信端=數據同步管理

          免費咨詢熱線:

          python 模塊BeautifulSoup 從HT

          python 模塊BeautifulSoup 從HTML或XML文件中提取數據

          、安裝

          Beautiful Soup 是一個HTML/XML的解析器,主要的功能也是如何解析和提取 HTML/XML 數據。

          lxml 只會局部遍歷,而Beautiful Soup 是基于HTML DOM的,會載入整個文檔,解析整個DOM樹,因此時間和內存開銷都會大很多,所以性能要低于lxml。

          BeautifulSoup 用來解析 HTML 比較簡單,API非常人性化,支持CSS選擇器、Python標準庫中的HTML解析器,也支持 lxml 的 XML解析器。

          pip install beautifulsoup4

          二、使用案例

          from bs4 import BeautifulSoup
          import requests
          import asyncio
          import functools
          import re
          
          house_info=[]
          
          '''異步請求獲取鏈家每頁數據'''
          async def get_page(page_index):
              headers={
                  'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/116.0.0.0 Safari/537.36'
              }
              request=functools.partial(requests.get, f'https://sh.lianjia.com/ershoufang/pudong/pg{page_index}/',
                                          headers=headers)
              loop=asyncio.get_running_loop()
              response=await loop.run_in_executor(None, request)
              return response
          
          
          '''使用xpath獲取房屋信息'''
          def get_house_info(soup):
              house_info_list=soup.select('.info')  # 房屋title
              reg=re.compile(r'\n|\s')
              for html in house_info_list:
          
                  house_info.append({
                      'title': re.sub(reg,'',html.select('.title a')[0].getText()),
                      'house_pattern': re.sub(reg,'',html.select('.houseInfo')[0].getText()),
                      'price': re.sub(reg,'',html.select('.unitPrice')[0].getText()),
                      'location': re.sub(reg,'',html.select('.positionInfo')[0].getText()),
                      'total': re.sub(reg,'',html.select('.totalPrice')[0].getText())
                  })
          
          '''異步獲取第一頁數據,拿到第一頁房屋信息,并返回分頁總數和當前頁'''
          async def get_first_page():
              response=await get_page(1)
              soup=BeautifulSoup(response.text, 'lxml')
              get_house_info(soup)
              print(house_info)
          
          
          if __name__=='__main__':
              asyncio.run(get_first_page())
          

          三、創建soup對象

          soup=BeautifulSoup(markup="", features=None, builder=None,parse_only=None, from_encoding=None, exclude_encodings=None,element_classes=None)

          • markup:要解析的HTML或XML文檔字符串。可以是一個字符串變量,也可以是一個文件對象(需要指定"html.parser"或"lxml"等解析器)。
          • features:指定解析器的名稱或類型。默認為"html.parser",可以使用其他解析器如"lxml"、"html5lib"等。
          • builder:指定文檔樹的構建器。默認為None,表示使用默認構建器。可以使用"lxml"或"html5lib"等指定其他構建器。
          • parse_only:指定要解析的特定部分。可以傳遞一個解析器或一個標簽名或一個元素的列表。
          • from_encoding:指定解析器使用的字符編碼。默認為None,表示自動檢測編碼。
          • exclude_encodings:指定要排除的編碼列表,用于字符編碼自動檢測。
          • element_classes:指定要用于解析文檔的元素類。默認為None,表示使用默認元素類。

          解析器

          使用方法

          優勢

          劣勢

          Python標準庫

          BeautifulSoup(markup,"html.parser")

          Python 的內置標準庫、執行速度適中 、文檔容錯能力強

          Python 2.7.3 or3.2.2) 前的版本中文容錯能力差

          LXML HTML 解析器

          BeautifulSoup(markup,"lxml")

          速度快、文檔容錯能力強

          需要安裝 C 語言庫

          LXML XML解析器

          BeautifulSoup(markup,"xml")

          速度快、唯一支持 XML 的解析器

          需要安裝 C 語言庫

          html5lib

          BeautifulSoup(markup,"html5lib")

          最好的容錯性、以瀏覽器的方式解析文檔、生成 HTML5 格式的文檔

          速度慢、不依賴外部擴展

          四、soup對象

          1. soup.prettify(encoding=None, formatter="minimal"):返回格式化后的HTML或XML文檔的字符串表示。它將文檔內容縮進并使用適當的標簽閉合格式,以提高可讀性
          2. soup.title:返回文檔的

          析動態內容

          根據權威機構發布的全球互聯網可訪問性審計報告,全球約有四分之三的網站其內容或部分內容是通過JavaScript動態生成的,這就意味著在瀏覽器窗口中“查看網頁源代碼”時無法在HTML代碼中找到這些內容,也就是說我們之前用的抓取數據的方式無法正常運轉了。解決這樣的問題基本上有兩種方案,一是JavaScript逆向工程;另一種是渲染JavaScript獲得渲染后的內容。

          JavaScript逆向工程

          下面我們以“360圖片”網站為例,說明什么是JavaScript逆向工程。其實所謂的JavaScript逆向工程就是找到通過Ajax技術動態獲取數據的接口。

          但是當我們在瀏覽器中通過右鍵菜單“顯示網頁源代碼”的時候,居然驚奇的發現頁面的HTML代碼中連一個<img>標簽都沒有,那么我們看到的圖片是怎么顯示出來的呢?原來所有的圖片都是通過JavaScript動態加載的,而在瀏覽器的“開發人員工具”的“網絡”中可以找到獲取這些圖片數據的網絡API接口,

          那么結論就很簡單了,只要我們找到了這些網絡API接口,那么就能通過這些接口獲取到數據,當然實際開發的時候可能還要對這些接口的參數以及接口返回的數據進行分析,了解每個參數的意義以及返回的JSON數據的格式,這樣才能在我們的爬蟲中使用這些數據。

          關于如何從網絡API中獲取JSON格式的數據并提取出我們需要的內容,在之前的《文件和異常》一文中已經講解過了,這里不再進行贅述。

          使用Selenium

          盡管很多網站對自己的網絡API接口進行了保護,增加了獲取數據的難度,但是只要經過足夠的努力,絕大多數還是可以被逆向工程的,但是在實際開發中,我們可以通過瀏覽器渲染引擎來避免這些繁瑣的工作,WebKit就是一個利用的渲染引擎。

          WebKit的代碼始于1998年的KHTML項目,當時它是Konqueror瀏覽器的渲染引擎。2001年,蘋果公司從這個項目的代碼中衍生出了WebKit并應用于Safari瀏覽器,早期的Chrome瀏覽器也使用了該內核。在Python中,我們可以通過Qt框架獲得WebKit引擎并使用它來渲染頁面獲得動態內容,關于這個內容請大家自行閱讀《爬蟲技術:動態頁面抓取超級指南》一文。

          如果沒有打算用上面所說的方式來渲染頁面并獲得動態內容,其實還有一種替代方案就是使用自動化測試工具Selenium,它提供了瀏覽器自動化的API接口,這樣就可以通過操控瀏覽器來獲取動態內容。首先可以使用pip來安裝Selenium。

          pip3 install selenium
          

          下面以“阿里V任務”的“直播服務”為例,來演示如何使用Selenium獲取到動態內容并抓取主播圖片。

          import requests
          from bs4 import BeautifulSoup
          def main():
           resp=requests.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
           soup=BeautifulSoup(resp.text, 'lxml')
           for img_tag in soup.select('img[src]'):
           print(img_tag.attrs['src'])
          if __name__=='__main__':
           main()
          

          運行上面的程序會發現沒有任何的輸出,因為頁面的HTML代碼上根本找不到<img>標簽。接下來我們使用Selenium來獲取到頁面上的動態內容,再提取主播圖片。

          from bs4 import BeautifulSoup
          from selenium import webdriver
          from selenium.webdriver.common.keys import Keys
          def main():
           driver=webdriver.Chrome()
           driver.get('https://v.taobao.com/v/content/live?catetype=704&from=taonvlang')
           soup=BeautifulSoup(driver.page_source, 'lxml')
           for img_tag in soup.body.select('img[src]'):
           print(img_tag.attrs['src'])
          if __name__=='__main__':
           main()
          

          在上面的程序中,我們通過Selenium實現對Chrome瀏覽器的操控,如果要操控其他的瀏覽器,可以創對應的瀏覽器對象,例如Firefox、IE等。運行上面的程序,如果看到如下所示的錯誤提示,那是說明我們還沒有將Chrome瀏覽器的驅動添加到PATH環境變量中,也沒有在程序中指定Chrome瀏覽器驅動所在的位置。

          selenium.common.exceptions.WebDriverException: Message: 'chromedriver' executable needs to be in PATH. Please see https://sites.google.com/a/chromium.org/chromedriver/home
          

          為了解決上面的問題,可以到Selenium的官方網站找到瀏覽器驅動的下載鏈接并下載需要的驅動,在Linux或macOS系統下可以通過下面的命令來設置PATH環境變量,Windows下配置環境變量也非常簡單,不清楚的可以自行了解。

          export PATH=$PATH:/Users/Hao/Downloads/Tools/chromedriver/
          

          其中/Users/Hao/Downloads/Tools/chromedriver/就是chromedriver所在的路徑。

          eautiful Soup 包:

          Beautiful Soup: Python 的第三方插件用來提取 xml 和 HTML 中的數據。官網地址 https://www.crummy.com/software/BeautifulSoup/

          1、安裝 Beautiful Soup

          打開 cmd(命令提示符),進入到 Python(Python2.7版本)安裝目錄中的 scripts 下,輸入 dir 查看是否有 pip.exe, 如果用就可以使用 Python 自帶的 pip 命令進行安裝,輸入以下命令進行安裝即可:

          pip install beautifulsoup4

          2、測試是否安裝成功

          編寫一個 Python 文件,輸入:

          import bs4

          print bs4

          運行該文件,如果能夠正常輸出則安裝成功。

          五、使用 Beautiful Soup 解析 html 文件

          # -*- coding: UTF-8 -*-
          import bs4
          import re
          
          from bs4 import BeautifulSoup
          
          html_doc="""
          <html><head><title>The Dormouse's story</title></head>
          <body>
          <p class="title"><b>The Dormouse's story</b></p>
          <p class="story">Once upon a time there were three little sisters; and their names were
          <a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>,
          <a href="http://example.com/lacie" class="sister" id="link2">Lacie</a> and
          <a href="http://example.com/tillie" class="sister" id="link3">Tillie</a>;
          and they lived at the bottom of a well.</p>
          <p class="story">...</p>
          """
          # 創建一個BeautifulSoup解析對象
          soup=BeautifulSoup(html_doc, "html.parser", from_encoding="utf-8")
          # 獲取所有的鏈接
          links=soup.find_all('a')
          print("所有的鏈接")
          
          for link in links:
              print(link.name, link['href'], link.get_text())
          
          print("獲取特定的URL地址")
          link_node=soup.find('a', href="http://example.com/elsie")
          print(link_node.name, link_node['href'], link_node['class'], link_node.get_text())
          
          print("正則表達式匹配")
          
          link_node=soup.find('a', href=re.compile(r"ti"))
          print(link_node.name, link_node['href'], link_node['class'], link_node.get_text())
          
          print("獲取P段落的文字")
          
          p_node=soup.find('p', class_='story')
          print(p_node.name, p_node['class'], p_node.get_text())
          

          ===========

          輸出:


          主站蜘蛛池模板: 亚洲国产一区二区三区| 台湾无码AV一区二区三区| 精品一区二区三区无码免费视频| 真实国产乱子伦精品一区二区三区| 狠狠综合久久av一区二区| 无码一区二区三区亚洲人妻| 日本精品3d动漫一区二区| 一区二区三区内射美女毛片 | 无码国产精品一区二区免费3p | 精品亚洲一区二区三区在线播放| 一区二区三区免费高清视频| 国产精品区一区二区三在线播放| 日本中文字幕一区二区有码在线| 亚洲一区二区三区乱码在线欧洲| 精品一区二区ww| 中文精品一区二区三区四区| 无码人妻一区二区三区在线 | 色多多免费视频观看区一区| 国产成人精品一区二区三区免费| 国产精品视频一区二区三区| 亚洲一区二区高清| 97精品国产一区二区三区 | 精品日韩在线视频一区二区三区 | 无码精品国产一区二区三区免费| 成人一区专区在线观看| 亚洲AV无码一区二区乱子伦| 国产精品亚洲一区二区三区久久 | 国产精品一区在线观看你懂的| 国产精品无圣光一区二区| 一区二区三区伦理高清| 亚洲一区AV无码少妇电影| 久久se精品动漫一区二区三区| 免费视频精品一区二区| 国产一区二区影院| 国产人妖视频一区二区破除| 亚洲欧美一区二区三区日产| 亚洲欧洲日韩国产一区二区三区| 久久久久久人妻一区精品| 性色AV一区二区三区| 亚洲精品一区二区三区四区乱码| 无码精品一区二区三区在线|