違規(guī)網(wǎng)站開發(fā) 開發(fā)者如何規(guī)避風險網(wǎng)絡(luò)營銷的營銷策略
今天遇到一個很有意思的問題,我的爬取的目標頁面上有時會出現(xiàn)一個彈窗,它擋住我點擊其它按鈕了,我想找到它的關(guān)閉按鈕,自動點擊一下關(guān)閉掉,本來是很簡單的事情,但偏偏出問題了,DOM中看到的html是這樣的:
<button id="ember213" class="msg-overlay-bubble-header__control artdeco-button artdeco-button--circle artdeco-button--1 artdeco-button--primary ember-view"><svg role="none" aria-hidden="true" class="artdeco-button__icon " xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" data-supported-dps="16x16" data-test-icon="close-small"><!----><use href="#close-small" width="16" height="16"></use></svg><span class="artdeco-button__text"> Close your conversation with {0} and Elise Tolliver</span>
</button>
看起來很簡單對吧,我習慣先在控制臺試一下,于是寫了
$x('//use[@href="#close-small"]')
發(fā)現(xiàn)匹配結(jié)果竟然是空的。
我的第一反應(yīng)是會不會是自定義的元素不能直接匹配,查了資料說是沒問題的,然后查了很多資料,發(fā)現(xiàn)可能跟命名空間有關(guān)系,像上面這個就是因為svg元素定義了xmlns屬性,所以瀏覽器認為它不是全局變量,所以無法用全局表達式//來匹配,但這種元素要怎樣匹配呢?
有兩種情況,
1、在匹配時加上準確的命名空間,還是上面的dom為例,可以這樣匹配,這種情形適合有多個不同命名空間的情形:
$x('//*[local-name()="svg" and namespace-uri()="http://www.w3.org/2000/svg"]')
2、還有一種簡化的寫法,就是直接用local-name()方法匹配(適合不需要區(qū)分命名空間的情形):
$x('//*[local-name()="svg"]')
所以最終我的表達式是:
$x('//*[local-name()="use" and @href="#close-small"]')
這樣就能準確地找到這個關(guān)閉按鈕了。
如果本文對你有幫助,請點贊支持一下,謝謝!