用PHP解析复杂的HTML表
我使用以下PHP代码成功解析了一个动态表:用PHP解析复杂的HTML表,php,html,domdocument,domxpath,Php,Html,Domdocument,Domxpath,我使用以下PHP代码成功解析了一个动态表: $docH = new DOMDocument(); $docH->loadHTMLFile($url); //get everything inside the body element: $bodyH = $docH->getElementsByTagName('body')->item(0); foreach ($bodyH->childNodes as $childNode) { echo $docH-
$docH = new DOMDocument();
$docH->loadHTMLFile($url);
//get everything inside the body element:
$bodyH = $docH->getElementsByTagName('body')->item(0);
foreach ($bodyH->childNodes as $childNode) {
echo $docH->saveHTML($childNode);
}
已解析的HTML表:
<table>
<tr>
<td>5CG</td>
<td>aass</td>
<td>sxs</td>
<td>sx</td>
<td>EK</td>
<td></td>
<td>72</td>
</tr>
<td></td>
<td>samplxs</td>
<td>xs</td>
<td></td>
<td>xss</td>
<td>fkxsx aus</td>
<td>s</td>
</tr>
<td></td>
<td>5AH.</td>
<td>ds</td>
<td>d</td>
<td>sdf</td>
<td>sdfsdf aus</td>
<td></td>
</tr>
<tr>
<td>6CG</td>
<td>3.</td>
<td>sfd</td>
<td></td>
<td>scs</td>
<td>das aus</td>
<td>a</td>
</tr>
<tr>
<td>7DG</td>
<td>6.</td>
<td>s</td>
<td>s</td>
<td>sD</td>
<td>sdsa.</td>
<td></td>
</tr>
<td></td>
<td>samplxs</td>
<td>xs</td>
<td></td>
<td>xss</td>
<td>fkxsx aus</td>
<td>s</td>
</tr>
<tr>
<td>7DG, 7CG, 7CR</td>
<td>6.</td>
<td>NsdR</td>
<td>s</td>
<td>SP</td>
<td>fasdlt aus</td>
<td>s</td>
</tr>
<td></td>
<td>samplxs</td>
<td>xs</td>
<td></td>
<td>xss</td>
<td>fkxsx aus</td>
<td>s</td>
</tr>
<tr>
<td>9BR</td>
<td>6.</td>
<td>FEI</td>
<td>sa</td>
<td>DE</td>
<td>fasdad aus</td>
<td></td>
</tr>
<tr>
<td>9AR, 9BR, 9CR</td>
<td>62.</td>
<td>BEH</td>
<td></td>
<td>sd</td>
<td>fasda aus</td>
<td></td>
</tr>
<tr>
<td></td>
<td>6.</td>
<td>MLR</td>
<td></td>
<td>FdR</td>
<td>fsdfaus</td>
<td></td>
</tr>
<tr>
<td>E10C</td>
<td>6.</td>
<td>sdf</td>
<td>d</td>
<td>d</td>
<td>fsdfs aus</td>
<td></td>
</tr>
<tr>
</table>
5CG
原子吸收光谱法
sxs
sx
埃克
72
样本数
xs
xss
fkxsx澳大利亚
s
5啊。
ds
D
自卫队
澳大利亚
6CG
3.
sfd
scs
达斯奥斯酒店
A.
7DG
6.
s
s
sD
sdsa。
样本数
xs
xss
fkxsx澳大利亚
s
7DG、7CG、7CR
6.
NsdR
s
服务提供商
时尚澳大利亚酒店
s
样本数
xs
xss
fkxsx澳大利亚
s
9BR
6.
菲
sa
判定元件
法斯达德奥斯酒店
9AR、9BR、9CR
62
贝赫
sd
法斯达奥斯酒店
6.
MLR
罗斯福
fsdfaus
E10C
6.
自卫队
D
D
澳大利亚
但我的目标是通过只要求
元素来显示用户想要的表的内容,其中第一个
的第一个
包含一些文本,直到有另一个
的第一个
具有不同的内容
例如:如果用户在输入字段中键入“9BR”,我只想让他看到:
9BR
6.
菲
sa
判定元件
法斯达德奥斯酒店
9AR、9BR、9CR
62
贝赫
sd
法斯达奥斯酒店
6.
MLR
罗斯福
fsdfaus
如果他输入5CG:
<tr>
<td>5CG</td>
<td>aass</td>
<td>sxs</td>
<td>sx</td>
<td>EK</td>
<td></td>
<td>72</td>
</tr>
<td></td>
<td>samplxs</td>
<td>xs</td>
<td></td>
<td>xss</td>
<td>fkxsx aus</td>
<td>s</td>
</tr>
5CG
原子吸收光谱法
sxs
sx
埃克
72
样本数
xs
xss
fkxsx澳大利亚
s
或者如果6CG只是:
<tr>
<td>6CG </td>
<td>3. </td>
<td>sfd </td>
<td> </td>
<td>scs </td>
<td>das aus</td>
<td>a </td>
</tr>
6CG
3.
sfd
scs
达斯奥斯酒店
A.
使用XPath,类似这样的东西应该可以达到目的查找第一个td包含文本“任何内容”的所有tr 对于以下第一个为空的tr
td
这可能不是最优雅的查询形式,但可以:
$query = '
//tr[td[1][contains(text(), "anything")]]
|
//tr[td[1][contains(text(), "anything")]]
/following-sibling::tr[td[1][not(text())] and preceding-sibling::tr[1][td[1][not(text()) or contains(text(), "anything")]]]
';
查找第一个td包含文本“任何内容”的所有tr
还可以查找所有tr,其中第一个td为空,以及其前兄弟姐妹(tr)的第一个td也为空或包含文本“任何内容”
示例:使用XPath表达式获取所需内容。哇,太快了,谢谢,我要查找它。如何选择一个空的
,或者无论有多少个空格都只包含空格?太好了!但是,如何在第一个td元素中没有文本的情况下,在第一个td元素和第一个td中有其他文本的元素之间添加以下tr元素!?例如:我被迷住了!谢谢!最后一件事:我如何回显html结果?foreach($xpath->query($query)as$res){var_dump($doc->saveHTML($res));}
-不客气:)有时我想要包含的以下空“”元素包含一个或更多的空白,而不仅仅是什么都没有……我试图添加它,但没有成功。你知道怎么改变它吗!?我想也许regex能帮上忙。
$query = '
//tr[td[1][contains(text(), "anything")]]
|
//tr[td[1][contains(text(), "anything")]]
/following-sibling::tr[td[1][not(text())] and preceding-sibling::tr[1][td[1][not(text()) or contains(text(), "anything")]]]
';