1. 程式人生 > >python網路資料探勘--JS隱式等待和顯式等待

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()),以及大量這裡沒有介紹的操作符