2009-12-09 38 views
1

考慮下面的HTML:基於文本找到一個HTML元素的ID顯示

<div id="f52_lblQuestionWording" title="" style="width:auto;height:auto; display: inline; overflow: hidden;" >Home telephone</div> 

我想自動獲得使用「家庭電話」字符串容器div元素的ID,沒有人知道我是怎麼可以通過正則表達式來做到這一點?

查找ID的字符串並不總是相同的,並且html是動態生成的,所以它可能會不時地有些不同。我正在使用Selenium在公司項目上自動化UI測試。

謝謝。

+0

您需要獲取具有指定字符串的DOM文本元素,然後獲取其父項。這可能會非常緩慢。這個目標到底是什麼?有沒有更好的方法來解決更大的問題? – 2009-12-09 18:53:39

回答

1

XPath是檢索XML和HTML文檔的值(只要它們都能很好地形成)的最簡單的方法搶id的值。

你想表達的是:「查找其文本值等於‘家庭電話’的所有div,並返回id屬性的匹配一切」

//div[text() = 'Home telephone']/@id 

讀取,

根據您的語言,通常有幾種內置或第三方(和免費)XPath解釋器可用。

使用正則表達式解析HTML是一個壞主意,因爲HTML不是常規語言。正則表達式不能處理最簡單的HTML邊界情況,因爲正則表達式無法正確處理嵌套。 HTML是一種固有的嵌套結構。

+0

感謝您的回覆。我使用java腳本來編寫Selenium中使用的擴展,這似乎是執行我所尋找的最佳方法。 – user228178 2009-12-10 10:46:21

0

我不知道你使用了「家庭電話」的字符串的意思,但這裏有一些方法可以做到這一點:

/id=(.*?)\s+.*(?=Home telephone)/ 

其中(=?)結構是正向前查找,如果你編程語言支持它。

另一種方法是簡單地用grep的家庭電話,然後用awk或sed的

0

在C#中,你會建立一個看起來像這樣的正則表達式:

string elementText = "Home\\stelephone"; // you can change this as needed 
Regex regex = new Regex(
    "id=\"(.*?)\"\\s+.*(?="+ elementText +")", 
RegexOptions.IgnoreCase 
| RegexOptions.CultureInvariant 
| RegexOptions.IgnorePatternWhitespace 
| RegexOptions.Compiled 
); 

// Capture all Matches in the InputText 
MatchCollection ms = regex.Matches(InputText); 

inputText的將是你的HTML文件進行讀取。