PHP简单的HTML DOM解析器
问题描述:
我刚开始使用PHP Simple HTML DOM Parser。PHP简单的HTML DOM解析器
现在我试图从一个现存的HTML文档中提取包含<b>
-tag inctauing </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>
答
请尝试以下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元素。然而,萤火虫给你
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
得到的跨度,然后使用
$e->prev_sibling()
返回元素的前一个兄弟(或空,如果没有找到)。但是,在你显示的标记中,既没有也没有。只有一个DIV与具有显着的一类孩子SPAN
<div style="text-align: center"> <span class="marked">marked</span>
如果是要匹配的东西,它的再次子组合子。当然,你必须将b改为div。
答
更简单的是从手动:
foreach($html->find('b') as $q)
echo $q->plaintext;
你的意思` 的`或` 的`? –
2011-01-27 08:12:45