2012-06-26 63 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