Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/html/82.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 用lxml抓取动态html字段_Python_Html_Web Scraping_Lxml_Lxml.html - Fatal编程技术网

Python 用lxml抓取动态html字段

Python 用lxml抓取动态html字段,python,html,web-scraping,lxml,lxml.html,Python,Html,Web Scraping,Lxml,Lxml.html,我一直在尝试使用lxml 代码非常简单,如下所示: from lxml import html import requests page = requests.get('http://www.airmilescalculator.com/distance/blr-to-cdg/') tree = html.fromstring(page.content) miles = tree.xpath('//input[@class="distanceinput2"]/text()') print mil

我一直在尝试使用
lxml
代码非常简单,如下所示:

from lxml import html
import requests
page = requests.get('http://www.airmilescalculator.com/distance/blr-to-cdg/')
tree = html.fromstring(page.content)
miles = tree.xpath('//input[@class="distanceinput2"]/text()')
print miles
我得到的结果只是一个空列表
[]
结果应该是列表中的一个数字。 然而,我能够刮同一页的静态字段


提前感谢您的帮助。

您无法从
输入
字段中选择文本节点,因为没有文本节点

<input type="text" class="distanceinput2" .. />
你应该得到它们

所需的值是计算出来的,因此我们需要访问页面并模拟
单击
以获取它们。
splinter
包就是为此而设计的

from pyvirtualdisplay import Display
display = Display(visible=0)
display.start()

from splinter import Browser

url = 'http://www.airmilescalculator.com/distance/blr-to-cdg/'

browser = Browser()
browser.visit(url)
browser.find_by_id('haemulti')[0].click()

print browser.find_by_id('totaldistancemiles')[0].value
print browser.find_by_id('totaldistancekm')[0].value
print browser.find_by_id('nauticalmiles')[0].value

browser.quit()


display.stop()
pyvirtualdisplay
用于隐藏浏览器

输出:

$python test.py 
4868
7834
4230

这里的问题是文本框中的值是由javascript添加的。页面加载时,文本字段中的值为0。所以,即使你刮,你也不会得到值,因为刮的内容得到了这个值

<input class="distanceinput2" id="totaldistancemiles" name="totaldistancemiles" readonly="readonly" size="5" title="Distance in miles" type="text" value="0"/>
<input class="distanceinput2" id="totaldistancekm" name="totaldistancekm" readonly="readonly" size="5" title="Distance in kilometers" type="text" value="0"/>
<input class="distanceinput2" id="nauticalmiles" name="nauticalmiles" readonly="readonly" size="5" title="Distance in nautical miles" type="text" value="0"/>

因此,如果你想得到网站上的价值,这是不可能的刮

你可以试试phantom JS,它就像一个无头浏览器。还没有尝试过,但看起来有机会。这是一个可以帮助你的方法


希望有帮助

如您所知,距离是根据对Google Maps API的XHR调用结果动态计算的。仅用
请求
模拟/重复这一点并不容易,因为您至少需要一个真正的浏览器所拥有的Javascript引擎

以下是您如何通过和headless解决此问题:


打印
4868

是的,我刚刚知道。数据来自ajax请求。你知道怎么做吗?我还可以使用其他库吗?试试上面回答中提到的phantom JS(),数据来自Ajax请求。有什么方法可以废弃Ajax加载的字段吗?@TauseefHussain检查我的编辑。我希望这会有用。非常感谢。我不知道如何处理
phantomJS
我在尝试运行代码
selenium.common.exceptions.webdrivexception:Message:“phantomJS”可执行文件需要在路径中。
有什么我遗漏的吗?@TauseefHussain
phantomJS
必须在路径上的某个地方。或者您可以显式地提供路径,示例:。就像魔术一样工作:)非常感谢!我必须进一步深入幻影来了解更多。
<input class="distanceinput2" id="totaldistancemiles" name="totaldistancemiles" readonly="readonly" size="5" title="Distance in miles" type="text" value="0"/>
<input class="distanceinput2" id="totaldistancekm" name="totaldistancekm" readonly="readonly" size="5" title="Distance in kilometers" type="text" value="0"/>
<input class="distanceinput2" id="nauticalmiles" name="nauticalmiles" readonly="readonly" size="5" title="Distance in nautical miles" type="text" value="0"/>
from selenium import webdriver

driver = webdriver.PhantomJS()
driver.get("http://www.airmilescalculator.com/distance/blr-to-cdg/")

distance = driver.find_element_by_id("totaldistancemilestext").text
print(distance)