HTML selenium firefox webdriver 未加载
HTML in selenium firefox webdriver not loading
我正在尝试在 python
中使用 Selenium Firefox
(无头)驱动程序抓取网站。
网页上的主播我都看了一遍,一个一个看完。但是我希望浏览器在移动到另一个页面之前等待页面上的 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)
。它返回了无法理解的文本,而不是页面的实际 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")>,
这是什么原因造成的?
我正在抓取的页面中的所有内容(与内容相关)都是静态的。
试试这个:
for node in body:
print(node.get_attribute('innerHTML'))
这会将 innerHTML
打印为字符串。
根据您当前的代码试验,您看到的输出非常合理。
presence_of_all_elements_located(定位器)
presence_of_all_elements_located() is the expectation for checking that there is at least one element present on a web page. A 用于查找元素和 returns WebElements 的 List
一旦找到它们。
您调用时:
body = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.TAG_NAME, "p")))
现在,body
包含 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"))
我正在尝试在 python
中使用 Selenium Firefox
(无头)驱动程序抓取网站。
网页上的主播我都看了一遍,一个一个看完。但是我希望浏览器在移动到另一个页面之前等待页面上的 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)
。它返回了无法理解的文本,而不是页面的实际 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")>,
这是什么原因造成的?
我正在抓取的页面中的所有内容(与内容相关)都是静态的。
试试这个:
for node in body:
print(node.get_attribute('innerHTML'))
这会将 innerHTML
打印为字符串。
根据您当前的代码试验,您看到的输出非常合理。
presence_of_all_elements_located(定位器)
presence_of_all_elements_located() is the expectation for checking that there is at least one element present on a web page. A List
一旦找到它们。
您调用时:
body = WebDriverWait(driver, 10).until(EC.presence_of_all_elements_located((By.TAG_NAME, "p")))
现在,body
包含 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"))