Python - 在 selenium 和 lxml 中相同的 xpath 不同的结果

Python - Same xpath in selenium and lxml different results

我有这个网站 http://www.google-proxy.net/,我需要获得第一个代理 ip:port。

br = webdriver.Firefox()
br.get("http://www.google-proxy.net/")
ip = br.find_element_by_xpath("//tr[@class='odd']/td[1]").text; time.sleep(random.uniform(1, 1))
port = br.find_element_by_xpath("//tr[@class='odd']/td[2]").text; time.sleep(random.uniform(1, 1))

而且效果很好。但现在我想对 lxml

做同样的事情
page = requests.get(proxy_server)
root = lxml.html.fromstring(page.text)
ip = root.xpath("//tr[@class='odd']/td[1]/text()")
port = root.xpath("//tr[@class='odd']/td[1]/text()")

我得到空列表。这是为什么?

看起来 'odd' class 是由 Javascript 添加到此站点的。

Selenium 在运行浏览器时会执行 Javascript,因此您得到了预期的 class。

requests库不会执行JS,所以没有'odd' class.

当您使用Selenium打开http://www.google-proxy.net时,JavaScript被启用。在这种情况下,JavaScript 将 类 oddeven 添加到 tr 元素。

requests.get 方法从 http://www.google-proxy.net 加载 HTML,但未启用 JavaScript。因此 类 oddeven 不会添加到 tr 元素中,并且您的 XPath/lxml 功能不会 select 任何东西。要复制此行为,您可以使用 JavaScript 切换器插件,例如 Chrome plugin。这使您可以在不启用 JavaScript 的情况下轻松加载网页。