本文将介绍如何使用Selenium/Python获取由JavaScript编写的html内容的详细情况,特别是关于selenium获取js数据的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您
本文将介绍如何使用Selenium / Python获取由JavaScript编写的html内容的详细情况,特别是关于selenium获取js数据的相关信息。我们将通过案例分析、数据研究等多种方式,帮助您更全面地了解这个主题,同时也将涉及一些关于javascript – 如何使用jquery获取由div包装的html隐藏值?、javascript – 如何使用selenium获取CSS选择器的所有元素的直接子代?、Javascript 函数未定义:Python Selenium、Python selenium 获取由 javascript的知识。
本文目录一览:- 如何使用Selenium / Python获取由JavaScript编写的html内容(selenium获取js数据)
- javascript – 如何使用jquery获取由div包装的html隐藏值?
- javascript – 如何使用selenium获取CSS选择器的所有元素的直接子代?
- Javascript 函数未定义:Python Selenium
- Python selenium 获取由 javascript
如何使用Selenium / Python获取由JavaScript编写的html内容(selenium获取js数据)
我正在使用Selenium进行网络爬网,我想在Selenium模拟点击假链接后获得由JavaScript编写的元素(例如链接)。
我尝试了get_html_source(),但其中不包含JavaScript编写的内容。
我写的代码:
def test_comment_url_fetch(self): sel = self.selenium sel.open("/rmrb") url = sel.get_location() #print url if url.startswith(''http://login''): sel.open("/rmrb") i = 1 while True: try: if i == 1: sel.click("//div[@WB_feed_type SW_fun S_line2'']/div/div/div[3]/div/a[4]") print "click" else: XPath = "//div[@WB_feed_type SW_fun S_line2''][%d]/div/div/div[3]/div/a[4]"%i sel.click(XPath) print "click" except Exception, e: print e break i += 1 html = sel.get_html_source() html_file = open("tmp\\foo.html", ''w'') html_file.write(html.encode(''utf-8'')) html_file.close()
我使用while循环单击一系列伪造的链接,这些伪造的链接触发js操作以显示额外的内容,而该内容正是我想要的。但是sel.get_html_source()没有提供我想要的东西。
有人可以帮忙吗?非常感谢。
答案1
小编典典由于我通常在提取的节点上进行后处理,因此我直接在浏览器中使用运行JavaScript execute_script
。例如,获取所有a-tag:
js_code = "return document.getElementsByTagName(''a'')"your_elements = sel.execute_script(js_code)
编辑:execute_script
和get_eval
是等效的,除了get_eval
执行隐式返回,execute_script
必须明确声明它。
javascript – 如何使用jquery获取由div包装的html隐藏值?
这是我的代码:http://jsfiddle.net/94MnY/1/
我试图获取div内每个隐藏字段的值.
我试过了
$(document).ready(function() { $('input#btndispHidden').click(function() { var totalHidden = 7; for(var i=0; i<totalHidden; i++) { alert($("#hiddenField hidden").html()); } }); });
但是Im得到的值是null.
我也想知道如何获取div中html元素的总数.在我的情况下,我将如何获得div中的总数隐藏字段.我指定了totalHidden = 7的值,但如果我不知道隐藏字段的总数,该怎么办?
请帮忙.提前致谢.
解决方法
我给你一个jsfiddle看
http://jsfiddle.net/94MnY/4/
$(document).ready(function() { $('input#btndispHidden').click(function() { $("#hiddenField input[type='hidden']").each(function(i,e){ alert($(this).val()); }); }); });
javascript – 如何使用selenium获取CSS选择器的所有元素的直接子代?
我正在尝试存储一个列表,它将包含元素的所有直接子代,但不包含其子(后代),当我使用“*”语法时,我得到所有元素的后代.
解决方法
为了得到“所有直接的元素的孩子,而不是他们的孩子”的身体,使用身体> *.
或者另一个例子,为了得到< div id ='question'>的所有直接后代,使用div#question> *.
Javascript 函数未定义:Python Selenium
如何解决Javascript 函数未定义:Python Selenium?
我正在通过以下代码导入打字稿 API。然后我通过带有硒的 Python 将其注入到 DOM 中。我已经通过 browserify 将其编译为 JS。
TS 代码如下:
import { App } from "api";
(window as any).api = new App();
然后通过以下python代码注入:
self.driver.get("website")
print("You have reached the page")
self.driver.execute_script("var s=window.document.createElement(''script'');\
s.src=''https://localhost:8000/injector.js'';\
window.document.head.appendChild(s);")
print("Script injected")
self.driver.execute_script("window.api.Function1();")
函数 1 成功执行,然后加载站点上的另一个页面。
当我尝试从该页面上的 API 运行另一个函数时,我收到“javascript 错误:函数 2 未定义”。其调用方式与前一个函数相同。
self.driver.execute_script("window.api.Function2();")
我已经尝试重新注入脚本,并检查加载此页面时它是否仍在 DOM 中,但是我无法让它调用此函数。 API 中的应用功能如下:
import { Items } from "./items/Items";
import { Login } from "./login/Login";
import { Market } from "./market/Market";
import { User } from "./user/User";
export class App {
private _market: Market;
private _items: Items;
private _login: Login;
private _user: User;
constructor() {
this._market = new Market();
this._items = new Items();
this._login = new Login();
this._user = new User();
}
/**
* Restores the console object
*/
restoreConsole(): void {
var i = document.createElement("iframe") as any;
i.style.display = "none";
document.body.appendChild(i);
window.console = i.contentwindow.console;
}
/**
* disables web app ability to track user''s actions.
*/
disableMonitoring(): void {
window.EASFCApp.prototype.onPause = (): any => {};
window.EASFCApp.prototype.onResume = (): any => {};
window.services.PIN.isEnabled = () => false;
window.services.PIN.isEnabledByUser = () => false;
window.services.PIN.isEnabledByConfig = () => false;
window.services.PIN.enabled = false;
window.TelemetryManager.trackEvent = () => {};
window.TelemetryManager.trackPage = () => {};
}
/**
* Sleep during specified time.
* @param ms time to sleep in milliseconds
*/
async sleep(ms: number) {
await new Promise((resolve) => {
setTimeout(() => resolve(undefined),ms);
});
}
/**
* Gets the Market module
* @returns market instance
*/
get market(): Market {
return this._market;
}
/**
* Gets the Items module
* @returns items instance
*/
get items(): Items {
return this._items;
}
/**
* Gets the Login module
* @returns login instance
*/
get login(): Login {
return this._login;
}
/**
* Gets the user module
* @returns user instance
*/
get user(): User {
return this._user;
}
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
Python selenium 获取由 javascript
如何解决Python selenium 获取由 javascript?
我使用了一个名为“网易云音乐”的在线音乐播放器,我的帐户中有多个播放列表,它们包含数千首曲目,并且组织和分类非常糟糕,并且保存了重复条目,因此我想将它们导出为sql 表来组织它们。
我找到了一种不用客户端软件查看播放列表的方法,就是点击播放列表页面顶部的分享按钮,然后点击“复制链接”。
但在客户端以外的任何浏览器中打开链接,播放列表将限制为 1000 首曲目。
但我找到了克服它的方法,我安装了 Tampermonkey,然后安装了 this script。
现在我可以在浏览器中查看完整的播放列表。
这是一个 sample playlist。
播放列表如下所示:
第一列是歌曲名,第二列是时长,第三列是艺术家,最后一列是专辑。
第一列、第三列和第四列的文字分别是歌曲、艺术家和专辑页面的超链接。
我对 html 一无所知,但我设法获得了它的数据结构。
我们需要的是位于 xpath //table/tbody
的表,每一行都是名为 tr(xpath //table/tbody/tr
) 的表的子节点。
这是一个示例行:
<td>
<div><span data-res-id="5221710" data-res-type="18" data-res-action="play" data-res-from="13" data-res-data="158624364"> </span><span>1</span></div>
</td>
<td>
<div>
<div>
<div>
<span>
<a href="#/song?id=5221710"><b title="Axel F">Axel F</b></a>
</span>
</div>
</div>
</div>
</td>
<td>
<span>03:00</span>
<div>
<ahref="javascript:;" title="添加到播放列表" hidefocus="true" data-res-type="18" data-res-id="5221710" data-res-action="addto" data-res-from="13" data-res-data="158624364"></a>
<span data-res-id="5221710" data-res-type="18" data-res-action="fav"title="收藏"></span>
<span data-res-id="5221710" data-res-type="18" data-res-action="share" data-res-name="Greatest Hits Of The Millennium 80''s Vol.2" data-res-author="Harold Faltermeyer" data-res-pic="https://p2.music.126.net/tOa6Tizqy755OZE7ITsw_g==/775155697626111.jpg"title="分享">分享</span>
<span data-res-id="5221710" data-res-type="18" data-res-action="download"title="下载"></span>
<span data-res-id="5221710" data-res-type="18" data-res-from="13" data-res-data="158624364" data-res-action="delete"title="删除">删除</span>
</div>
</td>
<td>
<divtitle="Harold Faltermeyer">
<span title="Harold Faltermeyer">
<a href="#/artist?id=34854" hidefocus="true">Harold Faltermeyer</a>
</span>
</div>
</td>
<td>
<div>
<a href="#/album?id=509819" title="Greatest Hits Of The Millennium 80''s Vol.2">Greatest Hits Of The Millennium 80''s Vol.2</a>
</div>
</td>
列是元素的子节点。
我设法获得了与列对应的 xpath:
/td[2]/div/div/div/span/a/b --> title
/td[2]/div/div/div/span/a --> song link
/td[3]/span --> duration
/td[4]/div/span/a --> artist
/td[4]/div/span/a[''href''] --> artist link
/td[5]/div/a --> album
/td[5]/div/a[''href''] --> album link
我们应该在链接前添加地址 music.163.com/
以获得完整地址。
我正在考虑使用 selenium 来获取元素,更具体地说,通过 xpath 查找行,然后遍历行并通过行内的 xpath 获取列,然后将值添加到命名元组列表中。
>从这里开始,将元素添加到 sql 表中是微不足道的。
但我就是无法让它工作。
我设法打开了一个 Firefox selenium 窗口,安装了 tampermonkey 和访问完整播放列表的脚本(这两个安装是手动完成的),然后进入播放列表页面并尝试获取元素:
from selenium import webdriver
Firefox = webdriver.Firefox()
Firefox.get(''https://music.163.com/#/playlist?id=158624364&userid=126762751'')
Firefox.find_elements_by_xpath(''//table/tbody/tr'')
结果是一个空列表。
我不知道出了什么问题,我可以在开发人员工具中查看表格元素就好了,然后我查看了它的源代码并意识到表格不在其源代码中。
我什至设法使用开发者工具获得了完整表格,并上传了 here。
但是硒是看不见的。显然浏览器有办法显示不在原始 html 源代码中的内容,而 selenium 不能。那时我才意识到浏览器可以执行javascript,原始源代码中没有的附加内容可能是某个地方的javascript添加的,而我使用的代码不涉及javascript 并且只能获取原始源代码,没有附加内容。
我试过谷歌搜索 python selenium get contents of a webpage added by javascript,但没有帮助。
所以我有两个问题,第一,在短期内,如何使用一些html解析库来解析本地存储在txt文件中的一段HTML代码?
第二,从长远来看,我如何使用 selenium 或任何其他 Python html 库来获取包含由 javascript 添加的附加内容的网页的完整源代码,而不仅仅是没有附加内容的原始源代码,以便不需要每次都手动导出元素?
解决方法
最简单的答案是,您必须在使用 Firefox.get(''https://music.163.com/#/playlist?id=158624364&userid=126762751'')
打开页面后添加一些延迟,然后才能使用 Firefox.find_elements_by_xpath(''//table/tbody/tr'')
获取元素以让页面上的元素加载。这需要几分钟。
所以,你可以简单地在那里添加一种 time.sleep(5)
。
更好的方法是使用预期条件。
像这样:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
Firefox = webdriver.Firefox()
# Wait for initialize,in seconds
wait = WebDriverWait(Firefox,20)
Firefox.get(''https://music.163.com/#/playlist?id=158624364&userid=126762751'')
wait.until(EC.visibility_of_element_located((By.XPATH,''//table/tbody/tr'')))
Firefox.find_elements_by_xpath(''//table/tbody/tr'')
UPD
那里有一个 iframe,因此您需要按如下方式切换到该 iframe:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
Firefox = webdriver.Firefox()
# Wait for initialize,20)
Firefox.get(''https://music.163.com/#/playlist?id=158624364&userid=126762751'')
iframe = driver.find_element_by_xpath(''//iframe[@id="g_iframe"]'')
driver.switch_to.frame(iframe)
wait.until(EC.visibility_of_element_located((By.XPATH,''//table/tbody/tr'')))
Firefox.find_elements_by_xpath(''//table/tbody/tr'')
我们今天的关于如何使用Selenium / Python获取由JavaScript编写的html内容和selenium获取js数据的分享就到这里,谢谢您的阅读,如果想了解更多关于javascript – 如何使用jquery获取由div包装的html隐藏值?、javascript – 如何使用selenium获取CSS选择器的所有元素的直接子代?、Javascript 函数未定义:Python Selenium、Python selenium 获取由 javascript的相关信息,可以在本站进行搜索。
本文标签: