1

在黑暗时代的某个时候,构建了一个脚本,输出以下 html..

...
<TABLE BORDER=0 FRAME=ALL_FRAMES RULES=ALL_RULES ALIGN=CENTER BGCOLOR="ffffe5">
<CAPTION ALIGN=TOP>
<FONT  COLOR=009594 SIZE=-1><B>Access Information</B></FONT>
</CAPTION>
<TR>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
<FONT  COLOR=black SIZE=-1><B>Access Circuit(s):</B></FONT>
</TD>
<TD ALIGN=LEFT VALIGN=MIDDLE>
**DATA TO COLLECT 111**
</TD>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
<FONT  COLOR=black SIZE=-1><B>Other Circuit(s):</B></FONT>
</TD>
<TD ALIGN=LEFT VALIGN=MIDDLE>
&nbsp
</TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
&nbsp
</TD>
<TD ALIGN=LEFT VALIGN=MIDDLE>
**DATA TO COLLECT AAA**
</TD>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
&nbsp
</TD>
<TD ALIGN=LEFT VALIGN=MIDDLE>
&nbsp
</TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
&nbsp
</TD>
<TD ALIGN=LEFT VALIGN=MIDDLE>
**DATA TO COLLECT BBB**
</TD>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
&nbsp
</TD>
<TD ALIGN=LEFT VALIGN=MIDDLE>
&nbsp
</TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
&nbsp
</TD>
<TD ALIGN=LEFT VALIGN=MIDDLE>
**DATA TO COLLECT CCC**
</TD>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
&nbsp
</TD>
<TD ALIGN=LEFT VALIGN=MIDDLE>
&nbsp
</TD>
</TR>
<TR>
<TD ALIGN=RIGHT VALIGN=MIDDLE>
<FONT  COLOR=black SIZE=-1><B>Customer:</B></FONT>
</TD>
...

<table>抱歉,我会向您展示表格布局,但如果没有SO ,我不知道该怎么做

如何使用 XPATH(在 PHP 中)只收集每个DATA TO COLLECT部分?到目前为止,我已经能够使用//*[*='Access Circuit(s):']/following-sibling::td[1].

注意事项:

  • 这只是大文档的一小部分。
  • 我无法更改脚本输出。
  • 我不知道会有多少行(图 0 到 6)。
  • 数据应该总是在同一个“列”中。
  • 我可能只有 XPATH 版本 1。但仍然欢迎版本 2 的答案。
4

1 回答 1

1

我想出的表达是这样的:

//TR[(.//B[.='Access Circuit(s):']) or ((./preceding-sibling::TR//B[.='Access Circuit(s):']) and (./following-sibling::TR//B[.='Customer:']))]//TD[2]

返回

<TD ALIGN="LEFT" VALIGN="MIDDLE">**DATA TO COLLECT 111**</TD>
<TD ALIGN="LEFT" VALIGN="MIDDLE">**DATA TO COLLECT AAA**</TD>
<TD ALIGN="LEFT" VALIGN="MIDDLE">**DATA TO COLLECT BBB**</TD>
<TD ALIGN="LEFT" VALIGN="MIDDLE">**DATA TO COLLECT CCC**</TD>

它使用第一行包含的知识Access Circuit(s):和第一个未收集的行包含的知识Customer:。如果您不能确定其中任何一个,那么我认为它不能用单个 XPath 表达式来完成。

Step-by-step
1. //TR[
2.     (.//B[.="Access Circuit(s):"])
3.     or (     (./preceding-sibling::TR//B[.="Access Circuit(s):"])
4.          and (./following-sibling::TR//B[.="Customer:"]) )
5.     ]//TD[2]

Means
1. all TR nodes
2. that either contain "Access Circuit(s):"
3. or
    - (3.) are positioned after "Access Circuit(s):"
    - (4.) and are positioned before "Customer:"
5. all TD nodes that are the second TD of their parents
于 2012-06-26T02:52:34.267 回答