记录一个日常中解决的问题,老规矩,基础知识在前,步骤在最后,可以直接看最后。
--------基础知识-----------
环境:python3 selenium3
python写的数据采集,对一般有规律的页面用 自带 + BeautifulSoup + 正则就可以搞定。但是也有比较复杂的情况,
例如:页面的内容是通过js生成,通过js跳转的,或者整个页面使用了大量js完成操作;对这种涉及页面脚本解析的内容,用前面的方法会异常吃力。
所以我们通常会使用游览器直接解析以及运行js。并通过python selenium完成程序与浏览器的交互。游览器的选择推荐使用 phantomjs 特点是,无头也就是无界面。当然,也可以使用chrome 或者 firefox 好处是,看的到执行步骤。
简单来说:selenium可以操作页面的元素,并且提供执行js脚本的接口。
一般执行方式有两个
execute_script()是同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕;
execute_async_script()方法是异步方法,它不会阻塞主线程执行。
如果要取结果,我们肯定使用第一个 execute_script()
execute_script() 方法如果有返回值,有以下几种情况:
如果返回一个页面元素(document element), 这个方法就会返回一个WebElement
如果返回浮点数字,这个方法就返回一个double类型的数字
返回非浮点数字,方法返回Long类型数字
返回boolean类型,方法返回Boolean类型
如果返回一个数组,方法会返回一个List<Object>
其他情况,返回一个字符串
如果没有返回值,此方法就会返回null
-------------正文开始-------------
问题:文本框的内容是用户自己输入的。通过JS执行后。无法取回结果
例如:
js = "document.getElementById('txtSearch').value;" a = driver.execute_script(js) 实验后我们会发现。其实JS得到了执行,比如给value 赋值。确实页面上会变化。说明定位以及执行是正常的。 而且我们也知道。执行是会有返回指的。但是用 print(type(driver.execute_script(js)))打印结果类型。会提示 无类型。 问题的答案在于。如果需要返回值,需要在js 的前面加上return 例如:
js2 = "return document.getElementById('txtSearch').value;" print(type(driver.execute_script(js2))) 这样一切就正常了。返回就是str 类型了。也就是可以得到js执行的结果了。
备注:
普通的文本框,也就是在HTML层面的内容。直接使用各种定位之后使用.text 即可
例如:
driver.find_element_by_id('你所选定的ID').text driver.find_element_by_class_name('你所选定的name').text
Comments | NOTHING