<table style="background-color: #008000; border-style: none;" border="0" cellpadding="2" cellspacing="2">
<tr>
<td>
<img height="5" width="5" border="0" src="https://spacer.gif" title="07:00,24hrs: B Shift /.../E704/RS704/Firefighter #2" alt="07:00,24hrs: B Shift /.../E704/RS704/Firefighter #2">
</td>
</tr>
</table>
<img height="2" width="2" border="0" src="https://spacer.gif" alt="">
<img alt="" height="1" width="1" border="0" src="https://spacer.gif">
</td>
<TD ALIGN="RIGHT" VALIGN="TOP" width="17%">
<a href="javascript:void(0)" title="01/15/2013" class="daylink" onClick="return DayClick('01/15/2013');">15</a>
</TD>
<td rowspan="2" width="5">
<img alt="" height="1" width="1" border="0" src="https://spacer.gif">
</td>
</tr>
<tr>
<TD COLSPAN="2">
<TABLE>
<TR>
<TD style="background-color: #41FFB9; " class="calexception">
<a href="javascript:void(0)" onClick="return ShowRemoveExceptionWindow("4A30E80.fre01","3280530");" title="10hrs DetNonEMSStud(10), 07:00 - 17:00" style="color: #000000; text-decoration: none; font-weight: bold;">DetNonEMSStud(10)</a>
</TD>
</TR>
</TABLE>
的iOS:
NSString *tutorialsXpathQueryString = @"//table/tr/td";
NSArray *tutorialsNodes = [tutorialsParser searchWithXPathQuery:tutorialsXpathQueryString];
NSLog(@"here is url: %@", tutorialsNodes);
NSMutableArray *newTutorials = [[NSMutableArray alloc] initWithCapacity:0];
for (TFHppleElement *element in tutorialsNodes) {
Tutorial *tutorial = [[Tutorial alloc] init];
[newTutorials addObject:tutorial];
tutorial.url = [element objectForKey:@"style"];
tutorial.title = [[element firstChild] objectForKey:@"title"];
我从<td>
获取样式,从<a>
获得标题就好了
我还需要从<table>
我是obj-c的新手,并且首次使用XPATH尝试,任何样本都会很棒!
答案 0 :(得分:1)
我没有使用过TFHpple,但是如果它支持标准的XPath,你应该可以使用这个XPath从td
转到它的包含表:
ancestor::table[1]
这个XPath选择最近的表是上下文节点的祖先,所以如果你有这个标记:
<table>
<tr><td></td></tr>
<tr>
<td>
<table><tr><td></td></tr></table>
<table>
<tr>
<td>Hey!</td>
</tr>
</table>
</td>
</tr>
</table>
您的上下文节点是td
,文本为“嘿!”,然后上面的XPath会选择第6行的表格。
看起来TFHpple没有提供在上下文节点上评估XPath的方法。鉴于此,一个新的建议 - 每个元素只有一个父母,所以如果你继续通过父母,你应该最终找到表。向下移动要困难得多,因为元素可以包含任意数量的直接子节点,每个子节点都有自己的子节点。我真的不知道Objective-C,但是如果你能确定这个表只有两个级别,那么这样的东西可能会起作用:
TFHppleElement *table = [[element parent] parent];
如果无法保证表格是两级,那么应该有一些方法可以通过父母的方式查找表格。这是伪代码,但希望你能得到这个想法:
for (TFHppleElement *element in tutorialsNodes) {
Tutorial *tutorial = [[Tutorial alloc] init];
[newTutorials addObject:tutorial];
tutorial.url = [element objectForKey:@"style"];
tutorial.title = [[element firstChild] objectForKey:@"title"];
TFHppleElement *table = [element parent];
while(table != null && [table tagName] != "table") {
table = [table parent]
}
// table should either be the parent table at this point,
// or null if there was no parent table.