我刚开始使用PHP Simple HTML DOM Parser。
现在,我正在尝试从现有的HTML文档中提取包含<b>
标记的所有元素,其中包含</b>
。这适用于
foreach($html->find('b') as $q)
echo $q;
如何才能仅显示<b>
,</b>
- 标记后跟<span class="marked">
所包围的元素?
更新: 我用firebug来获取元素的css路径。现在它看起来像这样:
foreach ($html->find('html body div#wrapper table.desc tbody tr td div span.marked') as $x)
foreach ($x->find('html body div#wrapper table.desc tbody tr td table.split tbody tr td b') as $d)
echo $d;
但它不起作用......任何想法?
更新
在此处澄清我的问题,该文档的示例tr包含起始表和结束表标记。
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="desc">
<tr>
<th width="25%" scope="col"><div align="center">1</div></th>
<th width="50" scope="col"><div align="center">2</div></th>
<th width="10%" scope="col"><div align="center">3</div></th>
<th width="15%" scope="col"><div align="center">4</div></th>
</tr>
<tr>
<td valign="top" bgcolor="#E9E9E9"><div style="text-align: center; font-weight: bold; margin-top: 2px"> 1 </div></td>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="split"> <tr>
<td>
<b> element to extract</b></td>
</tr>
<tr>
<td>
<table width="100%" border="0" cellspacing="0" cellpadding="0" class="split"> <tr>
<td width="15px" valign="top"> </td>
<td width="15px" valign="top">
<div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px">
1
</div>
</td>
<td>
abed
</td>
</tr>
<tr>
<td width="15px" valign="top"> </td>
<td width="15px" valign="top">
<div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px">
2
</div>
</td>
<td>
ddee
</td>
</tr>
<tr>
<td width="15px" valign="top"> </td>
<td width="15px" valign="top">
<div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px">
3
</div>
</td>
<td>
xdef
</td>
</tr>
<tr>
<td width="15px" valign="top"> </td>
<td width="15px" valign="top">
<div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px">
4
</div>
</td>
<td>
abbcc
</td>
</tr>
<tr>
<td width="15px" valign="top"> </td>
<td width="15px" valign="top">
<div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px">
5
</div>
</td>
<td>
ab
</td>
</tr>
<tr>
<td width="15px" valign="top"> </td>
<td width="15px" valign="top">
<div style="background-color:green ;color:#FFFFFF; text-align:center;padding-bottom: 1px">
6
</div>
</td>
<td>
e1
</td>
</tr>
</table>
</td>
</tr>
</table>
</td>
<td valign="top"><div style="text-align: center"> <span class="marked">marked</span> </div></td>
<td valign="top"><div style="text-align: center"> </div></td>
</tr>
</table>
答案 0 :(得分:3)
尝试以下CSS selector
b > span.marked
这会返回跨度,所以你可能需要$e->parent()
才能到达b元素。
另请参阅Best Methods to parse HTML了解SimpleHtmlDom
的替代方法更新后修改:
Your browser will modify the DOM。 If you look at your markup,你会发现没有tbody元素。然而Firebug给你
html body div#wrapper table.desc tbody tr td div span.marked'
html body div#wrapper table.desc tbody tr td table.split tbody tr td b'
此外,您的问题与查询不符。你问过如何找到
包含
的元素<b>,</b>
- 标记后跟<span class="marked">
这可以理解为
<b><span class="marked">foo</span></b>
或
<b><element>foo</element></b><span class="marked">foo</span>
首次使用我之前显示的child combinator。对于第二个,请使用adjacent sibling combinator
b + span.marked
获取span,然后使用$e->prev_sibling()
返回元素的前一个兄弟(如果未找到则返回null)。
但是,在你显示的标记中,既没有也没有。只有一个带有SPAN孩子的DIV具有标记的类
<div style="text-align: center"> <span class="marked">marked</span>
如果这是您想要匹配的内容,那么它又是子组合子。当然,你必须将b更改为div。
答案 1 :(得分:-1)
更简单的是手册:
foreach($html->find('b') as $q)
echo $q->plaintext;