hpple功能有限,使用的时候要注意一个原则:如果页面复杂,节点较多,解析的html需要先截取,xpath路径尽可能短,使用简单语法。
XPath语法不再赘述,本文的话题是分析得到的一个TFHppleElement数组。
对于数组里的某个TFHppleElement可能有如下结构:
{
nodeChildArray = (
{
nodeContent = "\n \U00a0";
nodeName = text;
},
{
nodeAttributeArray = (
{
attributeName = href;
nodeContent = "/character/ch0146096/?ref_=ttfc_fc_cl_t1";
}
);
nodeChildArray = (
{
nodeContent = "Tyrion Lannister";
nodeName = text;
}
);
nodeName = a;
},
{
nodeContent = "\n (28 episodes, 2011-2013)\n ";
nodeName = text;
}
);
nodeName = div;
}
假设我们令elem为指向上述结构的指针,则
[elem children];得到子节点数组
[elem childrenWithTagName:@"text"];可以得到div节点的所有文本子节点。
[elem firstChildrenWithTagName:@"text"];则可以得到div节点的第一个文本节点。
[elem tagName]; 则得到@"div"
[elem attributes];可以得到div的属性字典,显然这里没
这里我们引入指向子节点a的指针a,则
[a objectForKey:@“href”];得到@"/character/ch0146096/?ref_=ttfc_fc_cl_t1"
[a firstTextChild]content]; 得到@“"Tyrion Lannister"
[a text];此处和上句效果一致,返回第一个文本节点的内容
但是[elem text]为@"\n \U00a0"
本例中我们没用到- (NSArray*) childrenWithClassName:(NSString*)className和- (TFHppleElement *) firstChildWithClassName:(NSString*)className
显然class和tagName是地位等同的,对于如下情况,我们就可以使用上述方法
Header 1
A paragraph.
Note that this is an important paragraph.
设elem指向body节点,[elem childrenWithClassName:@"intro"]打印出来就是:
elem is (
"{\n nodeAttributeArray = (\n
{\n attributeName = class;\n nodeContent = intro;\n }\n );
\n nodeChildArray = (\n
{\n nodeContent = \"Header 1\";\n nodeName = text;\n }\n );
\n nodeName = h1;\n}"
)
补充一点,对于a的某个属性节点,结构为
{
nodeChildArray = (
{
nodeContent = "/character/ch0146096/?ref_=ttfc_fc_cl_t1";
nodeName = text;
}
);
nodeName = href;
}