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”可执行文件需要在路径中。
有什么我遗漏的吗?@TauseefHussainphantomJS
必须在路径上的某个地方。或者您可以显式地提供路径,示例:。就像魔术一样工作:)非常感谢!我必须进一步深入幻影来了解更多。
<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)