Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jsp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在XPATH中从html表检索多行节点数据?_Xpath_Domxpath - Fatal编程技术网

如何在XPATH中从html表检索多行节点数据?

如何在XPATH中从html表检索多行节点数据?,xpath,domxpath,Xpath,Domxpath,在黑暗时代的某个时候,构建了一个脚本,输出以下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> <

在黑暗时代的某个时候,构建了一个脚本,输出以下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>
...
。。。
访问信息
接入电路:
**收集数据111**
其他电路:
 
 
**收集AAA的数据**
 
 
 
**收集BBB的数据**
 
 
 
**收集CCC的数据**
 
 
客户:
...
对不起,我想给你看一下表格的布局,但是如果没有
的话,我不知道怎么做

如何使用XPATH(在PHP中)仅收集每个
数据以收集
部分?到目前为止,我已经能够使用
/*[*='Access Circuit:']/以下兄弟姐妹::td[1]
检索到第一行

注意事项:

  • 这只是一个大文档的一小部分
  • 我无法更改脚本输出
  • 我不知道会有多少行(图0到图6)
  • 数据应始终在同一“列”中
  • 我可能只有XPATH版本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>
      

      我想到的表达是:

      //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”部分前后的许多其他不需要的第二个
      td
      子节点。这个逻辑看起来与我的工作完全一样。但是,
      (.//B[.=“访问电路:”)
      返回整个文档的第二个
      td
      子级,而
      (/前面的同级::TR//B[.=“访问电路:”])和(/后面的同级::TR//B[.=“客户:”)
      不返回任何内容。我只是对XPATH不够精通,不知道如何调整它。我花了一天的大部分时间才发现我使用的数据与我预期的数据不同。(facepalm)一旦我把两个对齐,它就工作得很好。最后,我使用了
      //tr[(./td/font/b[.=“访问电路:”])或(./previous sibling::tr/td/font/b[.=“访问电路:”])和(./following sibling::tr/td/font/b[.=“Customer:”)]/td[2]
      。此外,我发现可以在Chrome的控制台中使用$x('query')进行测试,这种情况很重要+1来引导我完成并付出额外的努力。哎呀,第一个节点没有正确标记,应该像其他节点一样收集。此外,这是一个非常大的文档的一小部分,除了表数据之外,没有标识标签。我应该说得更清楚些。我已经编辑了我的源代码…这意味着第一个表达式工作得很好,不是吗?…除了它将返回文档中“Access Circuit”部分前后的许多其他不需要的第二个
      td
      子节点。这个逻辑看起来与我的工作完全一样。但是,
      (.//B[.=“访问电路:”)
      返回整个文档的第二个
      td
      子级,而
      (/前面的同级::TR//B[.=“访问电路:”])和(/后面的同级::TR//B[.=“客户:”)
      不返回任何内容。我只是对XPATH不够精通,不知道如何调整它。我花了一天的大部分时间才发现我使用的数据与我预期的数据不同。(facepalm)一旦我把两个对齐,它就工作得很好。最后,我使用了
      //tr[(./td/font/b[.=“访问电路:”])或(./previous sibling::tr/td/font/b[.=“访问电路:”])和(./following sibling::tr/td/font/b[.=“Customer:”)]/td[2]
      。此外,我发现可以在Chrome的控制台中使用$x('query')进行测试,这种情况很重要+谢谢你陪我走过并付出额外的努力。