xpath在特定节点下面找到一个文本框,该节点又包含特定的子节点

时间:2017-07-13 13:45:00

标签: html xpath

我很难为这个创建一个标题!

下面是我正在解析的示例HTML - 为了简洁起见,部分被截断,但希望有足够的人能够理解我正在寻找的内容。

我希望在示例代码的最底部标识INPUT。 我不能使用ID,因为它会不断变化。即id="id_mstr111_txt"

让我用英语尽我所能描述我想要达到的目标:

  

找到INPUT
  ...在DIVclass="mstrPromptQuestion"作为后代

     

...... span class="mstrPromptQuestionTitleBarTitle">Abstracted Period

或写另一种方式:

  

给定DIV class="mstrPromptQuestion",其中包含深度嵌入的子节点:span class="mstrPromptQuestionTitleBarTitle">Abstracted Period   找到INPUT(不使用ID,因为数字会随着每次构建而变化)

我不确定XPath 2.0jquery是否可行,只有BASIC xpath功能。

<div id="id_mstr85" **class="mstrPromptQuestion"** style="display: block;">
  <span class="mstrPromptQuestionRequired">
    <div class="mstrPromptQuestionTitleBar">
      <table cellspacing="0" cellpadding="0">
        <tbody>
          <tr>
            <td valign="middle" align="left">
              <span class="mstrPromptQuestionTitleBarIndex" style="display: inline;">2.</span>
  <span **class="mstrPromptQuestionTitleBarTitle">Abstracted Period**</span>
  <span class="mstrPromptQuestionTitleBarRequired" title="(Required)">(Required)</span>
  </td>

  </tr>
  </tbody>
  </table>
</div>
<table class="mstrPromptQuestionInfoTable" cellspacing="0" cellpadding="0">
  <tbody>
    <tr>
      <td class="mstrPromptQuestionInfoCellLeft">
        <td class="mstrPromptQuestionInfoCellRight">
        </td>
      </td>
    </tr>
  </tbody>
</table>
<div class="mstrPromptQuestionContents">
  <table class="mstrPromptQuestionSimpleAnswerViewTitle" style="display: none;" cellspacing="0" cellpadding="0">
    <div class="mstrPromptQuestionSimpleAnswerView" style="padding-left: 0px;" onmousedown="this.previousSibling.rows[0].cells[0].childNodes[0].checked = true; mstr.behaviors.PromptQuestion.onClickRadio('id_mstr85', false)">
      <table id="id_mstr89" class="mstrListCart" style="display: table;" cellspacing="0" cellpadding="0">
        <colgroup>
          <tbody>
            <tr>
              <td class="mstrListCartCellAvailableHeader">
                <table class="mstrListCartTablePathView" cellspacing="0" cellpadding="0">
                  <div id="id_mstr108" class="mstrSearchField" title=" style=" display: block;="">
                    <table class="mstrSearchFieldTable" cellspacing="0" cellpadding="0">
                      <tbody>
                        <tr>
                          <td class="mstrSearchFieldSearchBox">
                            <div id="id_mstr111" class="mstrTextBoxWithIcon" title=" style=" display: block;="">
                              <div class="mstrTextBoxWithIconCaption">
                                <table class="mstrTextBoxWithIconTable" cellspacing="0" cellpadding="0">
                                  <tbody>
                                    <tr>
                                      <td class="mstrTextBoxWithIconCellInput">
                                        <div><**input** id="id_mstr111_txt" maxlength="" onclick="if (mstr.utils.ISW3C) {this.focus();}" onkeypress="return mstr.behaviors.TextBoxWithIcon.onkeypress(arguments[0], self, 'id_mstr111', this.value)" name="id_mstr111_txt"
                                            style="background-color: rgb(255, 255, 255);" size="" type="text" /></div>
                                      </td>

2 个答案:

答案 0 :(得分:0)

用英语描述:

//div[@class='mstrPromptQuestion'][.//span[@class='mstrPromptQuestionTitleBarTitle']]//input[contains(@id, '_txt')]

写另一种方式是相同的,只有你指定不使用id。

根据属性或基于孩子识别唯一的父级,并从那里继续。

对于上述xpath,您还可以向范围添加文本约束,如

 [contains(text(), 'Abstracted Period')]

导致类似:

//div[@class='mstrPromptQuestion'][.//span[@class='mstrPromptQuestionTitleBarTitle'][contains(text(), 'Abstracted Period')]]//input[contains(@id, '_txt')]

答案 1 :(得分:0)

如果您确定它是input中的最后一个div,您可以执行以下操作:

(//div[@class='mstrPromptQuestion']//input)[last()]

或类似的东西:

(//div[@class='mstrPromptQuestion' and .//span[@class='mstrPromptQuestionTitleBarTitle']='Abstracted Period']//input)[last()]

如果mstrPromptQuestionTitleBarTitle很重要。