2012-06-26 29 views
1

有时在黑暗时代的脚本建输出下面的HTML ..如何从XPATH中的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的答案仍然受欢迎。

回答

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 
+0

糟糕,该第一个节点没有正确标记,应该像其他收集。这也是非常大的文档的一小部分,除了表格数据以外没有识别标签。我应该更清楚。我编辑了我的源文件。 – Isius

+0

...这意味着第一个表达效果很好,不是吗? –

+0

...除了它将在“访问电路”部分之前和之后返回许多其他不需要的第二个'td'子节点。 – Isius