XPath选择父母兄弟姐妹的后代

时间:2011-10-03 01:38:26

标签: php xpath

我的xpath:  (// tr [td [contains(。,'车辆类型优化')]] [1] / follow-sibling :: tr / td / div / table / tr / td / font / ul / li / a < / p>

我的来源:

<tr><td><font color="White">Refine by Vehicle Types</font></td> </tr>
<tr><td><div>
  <table> <tr> <td><font<ul><li><a> Automobile/Light Trucks</a></li></ul></font></td> </tr> </table>
</div></td> </tr>
<tr> <td></td> </tr>
<tr> <td><font>Refine by Category</font></td> </tr>
<tr> <td><div>
  <table> <tr> <td><font><ul><li><a>Agricultural</a></li></ul></font></td></tr>

我正在尝试抓取此来源并在“按车辆类型优化”之后收集<li>个节点,而不是在“按类别细化”之后收集。

任何帮助都是适当的。

2 个答案:

答案 0 :(得分:1)

你快到了。

更改

   (//tr
      [td[contains(., 'Refine by Vehicle Types')]]
    )
     [1]
      /following-sibling::tr
        /td/div/table
                 /tr/td/font
                         /ul/li/a

   (//tr
      [td[contains(., 'Refine by Vehicle Types')]]
    )
     [1]
      /following-sibling::tr[1]
        /td/div/table
                 /tr/td/font
                         /ul/li/a

当针对以下XML文档评估第二个XPath表达式时(您严重格式错误的文本已更正为格式良好的XML文档):

<table>
<tr>
  <td>
     <font color="White">Refine by Vehicle Types</font>
  </td>
</tr>
  <tr>
    <td>
      <div>
        <table>
           <tr>
             <td>
               <font>
                  <ul>
                     <li>
                        <a> Automobile/Light Trucks</a>
                     </li>
                  </ul>
               </font>
             </td>
           </tr>
        </table>
      </div>
    </td>
  </tr>
  <tr>
    <td></td>
  </tr>
  <tr>
    <td>
      <font>Refine by Category</font>
    </td>
  </tr>
  <tr>
    <td>
      <div>
        <table>
          <tr>
            <td>
              <font>
                <ul>
                  <li><a>Agricultural</a></li>
                </ul>
              </font>
            </td>
          </tr>
        </table>
      </div>
    </td>
  </tr>
</table>

只有一个 - 想要的 - a元素被选中

<a> Automobile/Light Trucks</a>

注意:我是否提到 XPath Visualizer 会对您有所帮助?

答案 1 :(得分:1)

对于强大的XPath,无论两个文本标签之间有多少tr / li元素都可以使用,请尝试:

(//tr
  [td[contains(., 'Refine by Vehicle Types')]]
)[1]
  /following-sibling::tr[not(preceding-sibling::tr
                              [contains(., 'Refine by Category')])]
    /td/div/table
             /tr/td/font
                     /ul/li/a

(借用@Dimitre的格式。)

上面的效率很低(可能是O(n ^ 2)),所以如果你有一个长页面,它可能会变慢。 但对于中等页面,应该没问题。