Selenium Firefox WebDriver中的HTML无法加载

时间:2018-07-13 13:11:02

标签: python selenium firefox headless geckodriver

我正在尝试使用Selenium Firefox中的python(无头)驱动程序来抓取网站。

我阅读了网页中的所有锚点,并一一遍解。但是我希望浏览器等待页面上的Ajax调用结束后才能移动到另一页面。

我的代码如下:

import time 
from selenium import webdriver
from selenium.webdriver.firefox.options import Options
from selenium.webdriver.support.ui import WebDriverWait

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities

caps = DesiredCapabilities().FIREFOX
caps["pageLoadStrategy"] = "eager"  #  complete

options = Options()
options.add_argument("--headless")

url = "http://localhost:3000/"

# Using Selenium's webdriver to open the page
driver = webdriver.Firefox(desired_capabilities=caps,firefox_options=options)
driver.get(url)
urls = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.TAG_NAME, "a")))

links = []

for url in urls:
    links.append(url.get_attribute("href"))

for link in links:
    print 'navigating to: ' + link
    driver.get(link)
    body = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.TAG_NAME, "p")))
    driver.execute_script("window.scrollTo(0,1000);")
    print(body)    
    driver.back()

driver.quit()

添加了行print(body)用于测试。并且返回了无法理解的text,而不是页面的实际HTML。这是印刷文本的一部分:

[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="e7dfa6b2-1ddf-438d-b562-1e2ac8416e07")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="6fe1ffb0-17a8-4b64-9166-691478a0bbd4")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="1f510a00-a587-4ae8-9ecf-dd4c90081a5a")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="c1bfb1cd-5ccf-42b6-ad4c-c1a70486cc98")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="be44db09-3948-48f1-8505-937db509a157")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="68f3c9f2-80b0-493e-a47f-ad69caceaa06")>, 

是什么原因造成的?

我要抓取的页面中的所有内容(与内容相关)都是静态的。

2 个答案:

答案 0 :(得分:2)

尝试一下:

for node in body: 
    print(node.get_attribute('innerHTML')) 

这会将innerHTML打印为字符串。

答案 1 :(得分:2)

根据您当前的代码试用版,您看到的输出非常合理。

presence_of_all_elements_located(定位符)

presence_of_all_elements_located()是检查网页上是否存在至少一个元素的期望。 Locator Strategy用于查找元素,并在 WebElements 找到后返回List

调用时:

body = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.TAG_NAME, "p")))

现在,body包含了{em> WebElements 的List。因此,当您调用:

print(body) 

元素的引用将打印到控制台,如下所示:

[<selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="e7dfa6b2-1ddf-438d-b562-1e2ac8416e07")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="6fe1ffb0-17a8-4b64-9166-691478a0bbd4")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="1f510a00-a587-4ae8-9ecf-dd4c90081a5a")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="c1bfb1cd-5ccf-42b6-ad4c-c1a70486cc98")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="be44db09-3948-48f1-8505-937db509a157")>, <selenium.webdriver.firefox.webelement.FirefoxWebElement (session="fb183e8b-ce36-47e7-a03e-d3aeea376304", element="68f3c9f2-80b0-493e-a47f-ad69caceaa06")>]

很大程度上取决于您要打印的内容。当您决定使用<p>标签来收集元素时,可能希望在其中打印文本。在这种情况下,您需要scrollIntoView元素,然后按如下所示打印 innerHTML

body = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.TAG_NAME, "p")))
for element in body:
    driver.execute_script("return arguments[0].scrollIntoView(true);", element)
    print(element.get_attribute("innerHTML"))