python網絡數據挖掘--JS隱式等待和顯式等待

第一部分:隱式等待和顯式等待

     隱式等待和顯式等待的不同之處在於,隱式等待是等DOM中某個狀態發生改變後再繼續運行代碼(沒有明確的等待時間,但是有最大等待期限,只要在時限內就可以),而顯式等待明確設置了等待時間,如上篇文章中等待三秒鐘。在隱式等待中,DOM被觸發的狀態是用expected_conditions定義的(前面使用了別名EC,是經常使用的簡稱)。在Selenium庫裏面元素被觸發的期望條件(expected conditions)有很多種,包括:

  • 彈出一個提示框
  • 一個元素被選中(比如文本框)
  • 頁面的標題改變了,或者某個文字顯示在頁面上或者某個元素裏
  • 一個元素在DOM中變成可見的,或者一個元素從DOM中消失了。
   當然,大多數的期望條件在使用前都需要你現制定等待的目標元素。元素用定位器(locator)指定。注意,定位器與選擇器是不一樣的。定位器是一種抽象的查詢語言,用By對象表示,可以用於不同的場合,包括創建選擇器。

   在下面的示例中,一個定位器被用來查找id是loadedButton的按鈕:

EC.presence_of_element_located((By.ID,"loadedButton"))
   定位器還可以用來創建選擇器,配合WebDriver的find_element函數使用:

print(driver.find_element(By.ID,"content").text)
   這行代碼功能和上面的代碼的功能是一致的:

print(driver.find_element_by_id("content").text)
   如果你可以不用定位器,就不要用,畢竟可以少導入一個模塊。但是,定位器是一種十分方便的工具,可以用在不同的應用中,並且具體很好的靈活性。

    下面是定位器通過By對象進行選擇的策略

  • ID
    在上面的例子裏用過,通過HTML的id屬性查找元素。

  • CLASS_NAME
    通過HTML的class屬性來查找元素。爲什麼這個函數是CLASS_NAME,而不是簡單的CLASS?在Selenium的Java庫裏使用object.CLASS可能會有問題,.class是Java保留的一個方法。爲了讓Selenium語法可以兼容不同的語言,就用CLASS_NAME代替。

  • CSS_SELECTOR
     通過CSS的class、id、tag屬性名來查找元素,用#idName、.className、tagName表示

  • LINK_TEXT
     通過鏈接文字查找HTML的<a>標籤。例如,如果一個鏈接文字是“Next”,就可以用(By.LINK_TEXT,"Next")來選擇

  • PARTIAL_LINK_TEXT
     與LINK_TEXT類似,只是通過部分鏈接文字來查找。

  • NAME
    通過HTML標籤的name屬性查找。這在處理HTML表單時非常方便

  • TAG_NAME
     通過HTML標籤的名稱查找

  • XPATH
    用XPath表達式(語法在下面介紹)選擇匹配方案。

第二部分:XPath語法

     XPath(XML Path,XML路徑)是在XML文檔中導航和選擇元素的查詢語言。它由W3C與1999年創建,在Python、Java和C#這些語言中有時會用XPath來處理XML文檔

     雖然BeautifulSoup不支持XPath,但是很多庫(lxml,Selenium,Scrapy等)都支持。它的使用方式通常和CSS選擇器(比如mytag#idname)一樣。雖然它原來本被設計用於處理更規範的XML文檔而不是HTML文檔。

    在XPath語法中有四個重要概念

  •     根節點和非根節點
  1. /div選擇div節點,只有當它是文檔的根節點時
  2. //div 選擇文檔中所有的div節點(包括非根節點)    
  •     通過屬性選擇節點
  1. //@href選擇帶href屬性的所有節點
  2. //a[@href='http://google.com']選擇頁面中所有指向google網站的鏈接

  •    通過位置選擇節點
  1.   //a[3]選擇文檔中的第三個鏈接
  2.   //table[last()]選擇文檔中的最後一個表
  3.   //a[position()<3]選擇文檔中的前三個鏈接
  • 星號(*)匹配任意字符或節點,可以在不同條件下使用
  1.    //table/tr/* 選擇所有表格行tr標籤的所有的子節點(這很適合選擇th和td標籤)
  2.    //div[@*] 選擇帶任意屬性的所有div標籤
    當然,XPath還有很多高級的語法特性。經過這些年的發展,它已經變成一種非常複雜的查詢語言,可以使用布爾類型、函數(如position()),以及大量這裏沒有介紹的操作符

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章