2014-01-20 33 views
0
import time 
from selenium import webdriver 
from selenium.webdriver.common.keys import Keys 
from datetime import datetime, timedelta 
from tkinter import StringVar, messagebox, Entry, Tk 

chromeOps=webdriver.ChromeOptions() 
chromeOps._binary_location = "C:\\Program Files\\Google\\Chrome\\Application\\chrome.exe" 
chromeOps._arguments = ["--enable-internal-flash"] 

browser = webdriver.Chrome("C:\\Program Files\\Google\\Chrome\\Application\\chromedriver.exe", port=4445, chrome_options=chromeOps) 
time.sleep(3) 

browser.get('website') 
elem=browser.find_element_by_id('MainForm') 
eli=elem.find_element_by_xpath('//*[@id="ReportHolder"]') 

現在超過該點是:的Python - 硒 - Webscrape表

表的xmlns:msxsl = 「甕:架構 - 微軟-COM:XSLT」 WIDTH = 「100%」

現在,我注意到這阻止了我直接對錶內容進行xpath處理。

所以我的問題是: 如何交互或提取此表的內容?

編輯: 試圖訪問表的XPath或內容拋出一個「NoSuchElementException異常」,代碼行,這是否是:

eli=elem.find_element_by_xpath('//*[@id="ReportHolder"]/table') 

(注:我不能給出確切的html因爲它是公司密碼保護位置。)

有沒有人遇到過類似的問題?或者任何人都可以注意到有關xpath的一些不當之處(即使它是直接複製檢查)。

EDIT2: 簡單的例子XHTML從 http://s1362.photobucket.com/user/superempl/media/roady2_zps3e1430d2.png.html

<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> 
    <head> 
     <meta charset="utf-8" /> 
     <title>XPath</title>  
    </head> 
    <body> 
     <form name="MainForm" method="post" action="hidden" id="MainForm"> 
      <div id="ReportHolder"> 
       <table xmlns:msxml="urn:schemas-microsoft-com:xslt" width="100%"> 
        <tr><td></td></tr> 
       </table> 
      </div> 
     </form> 
    </body> 
</html> 
+1

請在您的問題中添加相關的html部分 –

+0

它如何防止您使用XPath?我不明白爲什麼會這樣。 – Arran

+0

如果您無法提供完整的文檔,請提供一個示例__對您的code_失敗。這個問題不能按原樣回答。 –

回答

-1

這是非常簡單的提取。這是一個計時問題。

解決方案:在xpath請求之前放置一個time.sleep(5)。

browser.get('http://www.mmgt.co.uk/HTMLReport.aspx?ReportName=Fleet%20Day%20Summary%20Report&ReportType=7&CategoryID=4923&Startdate='+strDate+'&email=false') 
time.sleep(5) 
ex=browser.find_element_by_xpath('//*[@id="ReportHolder"]/table/tbody/tr/td') 

XPath是請求動態內容的引用。

該表格是動態內容和需要較長的時間來加載內容,那麼它爲Python程序到達線:從先前的線

ex=browser.find_element_by_xpath('//*[@id="ReportHolder"]/table/tbody/tr') 

browser.get('http://www.mmgt.co.uk/HTMLReport.aspx?ReportName=Fleet%20Day%20Summary%20Report&ReportType=7&CategoryID=4923&Startdate='+strDate+'&email=false') 
+0

我會downvote每一個建議任何形式的線程睡眠的答案。 –

+0

如果你的元素需要5.01秒纔會出現什麼情況?或者如果需要4秒,那麼你只是在浪費時間。 –

0

比使用相反線程睡眠,你應該使用等待類。我沒有用Python編寫的webdriver的,但它應該是這樣的:

from selenium import webdriver 
from selenium.webdriver.common.by import By 
from selenium.webdriver.support.ui import WebDriverWait # available since 2.4.0 
from selenium.webdriver.support import expected_conditions as EC# available since 2.26.0 

element = WebDriverWait(driver, 10).until(EC.presence_of_element_located((By.XPath, '//*[@id="ReportHolder"]/table/tbody/tr'))) 

的webdriverwait presence_of_element_located將返回的元素,一旦它出現在DOM,然後你可以用它進行交互。