프로젝트 전체에서 DomCralwer 를 사용해 왔지만 이 XPath 쿼리에 버그가 //table[*[self::tbody or self::thead or self::tfoot]/tr[count(*) = 2]]
있으므로 해결 방법으로 기본 제공 기능을 사용하려고합니다.
for ($i=0; $i < count($tables); $i++) {
$tables[$i] = purifyTables($tables[$i]);
echo($tables[$i]);
$dom = new DOMDocument();
$dom->loadHTML( $tables[$i] );
$xpath = new DOMXPath($dom);
$nodes = $xpath->query("//table[*[self::tbody or self::thead or self::tfoot]/tr[count(*) = 2]]");
echo($nodes);
echo($dom->saveHTML($nodes));
}
... 그러나 출력은 예상치 못한 것입니다.
<table>
<tr>
<td>
WII 5-IN-1 SPORTS KIT H7/10 5-in-1 Glow-in-the-Dark Sports
Pack for Wii
</td>
</tr>
<tr>
<td></td>
</tr>
<tr>
<td>
Our Price: $19.99 Sale: $5.00 You Save: 75%
</td>
</tr>
</table>
DOMNodeList Object
(
[length] => 0
)
PHP Warning: DOMDocument::saveHTML() expects parameter 1 to be DOMNode, object given in /var/www/html/myscript.php on line 195
Warning: DOMDocument::saveHTML() expects parameter 1 to be DOMNode, object given in /var/www/html/myscript.php on line 195
XPath Expresson
//table[*[self::tbody or self::thead or self::tfoot]/tr[count(*) = 2]]
선택 모든 table
가진들 tbody
, thead
또는 tfoot
A를 자식 (그 중 하나) tr
아이가 정확히 두 개의 자식 노드를 갖는. 샘플 HTML의 테이블이 표현식과 일치하지 않기 때문에 빈 DOMNodeList
. 때문에이 일치하지 않는 table
요소가 나와 아이들의 아무도가 없습니다 ( tbody
, thead
또는 tfoot
).
질문에 대한 의견에서 정확히 두 개의 열이있는 모든 테이블을 가져 오려고한다는 것을 알아 냈습니다. 다음 XPath 표현식을 사용하여이를 수행 할 수 있습니다.
//table[(.|tbody|thead|tfoot)/tr[count(td) = 2]]
태그 tbody
,, thead
및 tfoot
태그 .
는 OR 된 요소의 시퀀스에 테이블 태그 ( ) 에 대한 참조를 포함하므로 선택 사항 입니다. 이 count
기능은 td
요소 만 선택합니다 .
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다