例如,我需要一个包含id属性集的所有标签的列表(它可以是任何其他属性,id只是一个例子).
假设我有一个HTML结构
<div id="a">
<div id="b">
<div id="c"></div>
</div>
</div>
Run Code Online (Sandbox Code Playgroud)
要使用querySelectorAll查询"a"的子项,我可以执行类似的操作
//Get "b", but not "c"
document.querySelectorAll('#a > div')
Run Code Online (Sandbox Code Playgroud)
我的问题是:是否可以在没有ID的情况下直接引用节点?我试过了
var a_div = document.getElementById('a')
a_div.querySelectorAll('> div') //<-- error here
Run Code Online (Sandbox Code Playgroud)
但我收到一个错误,告诉我我使用的选择器无效.
如果有人想知道,我真正的用例会更复杂,比如'> .foo .bar .baz'所以我宁愿避免手动DOM遍历.目前我正在为root div添加一个临时id,但这似乎是一个丑陋的黑客......
出于某种原因,当我尝试运行以下代码时:
var casper = require('casper').create();
var x = require('casper').selectXPath;
var links = [];
casper.start('http://www.website.com');
function getLinks() {
var links = document.querySelectorAll(x('//*[@id="horizontalList"]/li[@class="paddingRight6"]/a');
return Array.prototype.map.call(links, function(e) {
return e.getAttribute('href')
});
}
casper.then(function() {
links = this.evaluate(getLinks);
this.echo(links);
}
casper.run();
Run Code Online (Sandbox Code Playgroud)
返回一个null对象,但是当我使用与thenClick方法相同的xpath选择器时,一切正常并且url会更改.为什么到底是这样的?
我正在尝试通过PowerShell进行一些网络抓取,因为我最近发现它可以毫不费力地这样做.
一个很好的起点是只获取HTML,使用Get-Member,看看我能从那里做些什么,如下:
$html = Invoke-WebRequest "https://www.google.com"
$html.ParsedHtml | Get-Member
Run Code Online (Sandbox Code Playgroud)
我可用于获取特定元素的方法如下所示:
getElementById()
getElementsByName()
getElementsByTagName()
Run Code Online (Sandbox Code Playgroud)
例如,我可以在文档中获取第一个IMG标记,如下所示:
$html.ParsedHtml.getElementsByTagName("img")[0]
Run Code Online (Sandbox Code Playgroud)
然而,在对我是否可以使用CSS Selectors或XPath进行更多研究之后,我发现有未列出的方法可用,因为我们只是使用此处记录的HTML Document对象:
querySelector()
querySelectorAll()
Run Code Online (Sandbox Code Playgroud)
所以不要这样做:
$html.ParsedHtml.getElementsByTagName("img")[0]
Run Code Online (Sandbox Code Playgroud)
我可以:
$html.ParsedHtml.querySelector("img")
Run Code Online (Sandbox Code Playgroud)
所以我期待能够做到:
$html.ParsedHtml.querySelectorAll("img")
Run Code Online (Sandbox Code Playgroud)
...为了获得所有的IMG元素.我发现的所有文档和我已经完成的谷歌搜索都支持这一点.但是,在我的所有测试中,此函数都会使调用进程崩溃,并在事件日志(0xc0000374)中报告堆损坏异常代码.
我在Windows 10 x64上使用PowerShell 5.我在Win10 x64虚拟机中尝试过它,这是一个干净的构建,只是修补了.我也尝试过在Win7 x64上升级到PowerShell 5.我在PowerShell 5之前没有尝试过任何东西,因为我们这里的所有系统都已经升级了,但是我可能会有时间假设一个新的vanilla虚拟机进行测试.
有没有人以前遇到过这个问题?到目前为止,我所有的研究都是死路一条.querySelectorAll有替代品吗?我需要抓取在不可预测的布局中有可预测的标签集的页面,并且可能没有分配给标签的ID或类,所以我希望能够使用允许结构/嵌套/通配符的选择器.
PS我也试过在PowerShell中使用InternetExplorer.Application COM对象,结果是一样的,除了PowerShell崩溃Internet Explorer崩溃.这实际上是我原来的方法,这里是代码:
# create browser object
$ie = New-Object -ComObject InternetExplorer.Application
# make browser visible for debugging, otherwise this isn't necessary for function
$ie.Visible = $true
# browse to page
$ie.Navigate("https://www.google.com")
# wait till browser is not busy
Do { Start-Sleep …Run Code Online (Sandbox Code Playgroud) 你好,这是我的 JavaScript 代码:
window.onload = function () {
function hideAds() {
setTimeout(hide, 2000);
}
function hide() {
var ads = document.querySelector(".ads");
ads.style.marginTop = (-ads.offsetHeight) + "px";
}
function reveal() {
ads.style.marginTop = "";
hideAds();
}
var ads = document.querySelector(".ads");
ads.addEventListener("click", reveal, true);
hideAds();
}
Run Code Online (Sandbox Code Playgroud)
从这段代码来看,除了“ads.addEventListener”倒数第二行之外,一切正常。是什么原因?我在这里做错了什么吗..?
我需要通过单击添加的广告类 div 来调用我的 Reveal 函数。
有人帮助我吗?
我怎么能测试CSS1-3选择器来检查它们是否得到了正确的元素,例如使用JavaScript(也许是jQuery)?
querySelectorAll()选择器是否像CSS一样从右到左进行评估,还是从左到右进行评估?
我在FF或Chrome中没有任何问题,但是IE9在这个方法上丢失了一个错误.我以为我可以使用它,因为它已被证明在这里得到支持:
http://www.quirksmode.org/dom/w3c_core.html
但是,实际情况似乎并非如此.话虽这么说,我可以用它代替什么?
编辑:这是它失败的确切行:
var maximize_buttons = document.querySelectorAll(".maximize");
Run Code Online (Sandbox Code Playgroud)
这是我第一次尝试使用querySelectorAll().浏览器版本号为9.0.8112.16421
编辑(再次):我已在两台独立的计算机上验证了此错误.但是,他们分享了一个共同点 - 他们都在VMware上运行Windows 7.这有关系吗?
浏览器模式是IE9,但默认情况下文档模式设置为怪癖.将其更改为Internet Explorer 9标准解决了问题,但如果怪癖是默认的,我仍然需要让它工作.
javascript internet-explorer selectors-api internet-explorer-9
使用时querySelectorAll,检查它是否返回任何元素的正确方法是什么?
它返回无法检查的内容false。这似乎不起作用:
var elements = document.querySelectorAll('.class');
if (elements) {
// doesn't work, `elements` is always true
}
Run Code Online (Sandbox Code Playgroud)
现在,我正在通过.length属性进行以下检查:
var elements = document.querySelectorAll('.class');
if (elements.length) {
// querySelectorAll returned DOM elements
}
Run Code Online (Sandbox Code Playgroud)
这是怎么做的?
所以基本上我想选择具有特定子元素的元素。现在我有选择器来选择链的子元素:
const el = document.querySelector('#leftMenu ul > li > a:not(.active) + ul > li.active')
Run Code Online (Sandbox Code Playgroud)
现在要获取我感兴趣的元素,我必须这样做:
const x = el.parentNode.parentNode;
Run Code Online (Sandbox Code Playgroud)
有什么方法可以直接从选择器本身获取这个元素吗?
selectors-api ×10
javascript ×8
css ×2
dom ×2
casperjs ×1
com ×1
debugging ×1
document ×1
mshtml ×1
powershell ×1
web-scraping ×1
xpath ×1