簡體   English   中英

嘗試使用來自自定義Firefox擴展/附加組件的xpath和javascript來引用頁面中的文本失敗

[英]Failing at attempt to reference text within a page using xpath and javascript from a custom Firefox extension/add-on

我已經有幾天的問題了,一直在StackOverflow和Google各處搜索答案。 這是Firefox擴展程序中的代碼,我引用的是網頁上的標簽/文本。 我正在嘗試從<b></b>標記的中間獲取文本。 該測試深入文檔中,因此我認為我可以使用xpath來引用它。 我一直在嘗試使用document.evaluate函數來引用它,但是沒有運氣。 這是我最近嘗試過的代碼片段:

var result = document.evaluate( '//*[@id="page"]/table[3]/tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b', document, null, XPathResult.STRING_TYPE, null );
alert( 'Value: ' + result.stringvalue );

我是DOM和xpath的新手,所以請讓我知道這是否至少在正確的軌道上。 我也嘗試過其他方法,但收效甚微。 我嘗試將其刪除的HTML代碼如下所示:

.
. Rest of the source
.
<b>This is title number 8955592</b>
.
.

我從chrome inspect元素功能獲得了xpath。 我還嘗試使用Firebug來查看其中是否有幫助。

Xpath:

//*[@id="page"]/table[3]/tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b

CSSPath:

#page > table:nth-child(3) > tbody > tr > td:nth-child(3) > table:nth-child(3) > tbody > tr:nth-child(9) > td:nth-child(2) > b

我的希望是我的xpath字符串中有一個簡單的格式錯誤,而我剛開始的字符串錯誤。 同樣的問題迫使我停止了我正在從事的另一個項目,因此我決定這次嘗試並實際解決這個問題。 我必須強調,這是我正在研究的Firefox擴展的一部分。 我還研究了節點作為實現此目的的一種方法,但是很快就變得很復雜。 很感謝任何形式的幫助。

首先,你有

result.stringvalue

應該是

result.stringValue

(大寫V)。 但是,這應該引發錯誤。 我認為您已經檢查了控制台中的錯誤?

沒有看到您要從中提取數據的頁面,很難說出問題所在。 但是您可以按以下方式縮小范圍:

var result = document.evaluate(
  '//*[@id="page"]', // /table[3]/tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b',
  document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );

我所做的只是獲取XPath表達式的第一部分,然后將其余部分注釋掉。 我還要求提供節點結果類型。 然后查看返回了多少個節點:

console.log(result.snapshotLength); // or alert() if you prefer

如果//*[@id="page"]表達式產生1個或多個結果,則擴展該表達式並重試:

 var result = document.evaluate(
  '//*[@id="page"]/table[3]', // /tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b',
  document, null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null );

並再次檢查result.snapshotLength。 當您將snapshotLength設置為零時,這就是XPath發生故障的地方。 那應該可以幫助您找出原因。 但是,如果您不知道原因,請向我們顯示這些結果,我們將看看是否可以提供幫助。

謝謝大家的幫助。 我終於想通了,對於您的遲到表示歉意。 我確實拼寫了stringValue,但是最終沒有使用此屬性。 我能夠在此方面繼續前進,並根據所提供的建議加以解決。 最初我得到的是不確定的結果。 當我從最后取出.stringValue時,結果是XPathResult對象。 后來我確定可以對XPathResult對象執行.singleNodeValue並獲取要使用的實際HTMLElement對象。 這是我最終用來解決此問題的最終結果:

document.evaluate( '//*[@id="page"]/table[3]/tbody/tr/td[3]/table[1]/tbody/tr[9]/td[2]/b', document, null, XPathResult.FIRST_ORDERED_NODE_TYPE, null ).singleNodeValue.innerHTML;

從頁面返回<b>text</b>的內容。 即使這看起來可能是獲得結果的乏味方法,但弄清楚這一點基本上可以教會我這些對象如何工作,而當我第一次問這個問題時我還是不明白。 使用系統的方式跟蹤我是否在正確的道路上(按照建議)非常有幫助。 再次感謝您的協助。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM