解析HTML时,会在字符串中添加随机字符吗?

时间:2011-11-26 13:42:09

标签: objective-c html-parsing

我正在解析HTML页面的表格,但是当我显示数据时,会添加随机字符,如下例所示:

Preowiveding但它应该是Preding

我不知道这是否是一种防止人们解析数据的安全功能 这很奇怪,因为有时文本显示正确而另一个文本显示错误...

我从这里得到的数据是this。 该表的HTML代码看起来有点奇怪:

<a target='_blank' href='#' class='draggableVerein' >&#76;<span style='display:none;'>&#105;<span style='display:none;'>&#115;&#105;&#118;&#98;&#97;</span><u></u>&#118;&#98;&#97;&#111;</span><u></u>&#105;&#101;&#98;&#101;&#110;&#97;&#117;</a>

在文本之间有spanu标记,它们似乎在浏览器中什么都不做,但在解析时会产生这些错误。

我使用Ben Reeves HTML Parser。 例如:

HTMLNode *node = [rowNode findChildWithAttribute:@"class" matchingName:@"rang" allowPartial:TRUE];
team.rang = [node allContents];

编辑:

现在我用HPPLE尝试了libXML2:

NSArray *elements  = [xpathParser searchWithXPathQuery:@"//table[2]/tr[5]/td/a"];
// Access the first cell
TFHppleElement *element = [elements objectAtIndex:0];

NSString *content = [element content];  
NSLog(@"content: %@",content);

输出为ersdorf而非Eggersdorf。 这个例子的HTML:

<a target='_blank' href='/datenservice/portal/verein/aktuelles.ds?vereinsNr=8070&sektionsId=485215725|665233118344931246&awVerband=ST_' class='draggableVerein' drag_img='/netzwerk/imagedownload/379402779304830775_383470150383145150-60-60-EfcSAtkX.jpg'>&#69;&#103;&#103;&#101;&#114;&#115;&#100;&#111;&#114;&#102;</a>

这是一个非常奇怪的代码 有什么提示吗?

2 个答案:

答案 0 :(得分:1)

看起来这里有两件事。

  1. 它使用HTML字符实体来指定常用字符(即&#76;而不是L)。这可能是混淆的尝试。
  2. 它使用<span style='display:none'> ... </span>告诉浏览器不要显示某些文字。这可能是尝试在文本中引入隐形垃圾。浏览器不会显示它,但HTML解析器仍然会吐出该文本。
  3. 如果您要丢弃垃圾文本,您的代码必须处理<span&gt; &安培; </span>标记并自动放弃样式设置为display:none的任何文字。

    注意:您链接的网页的来源有版权声明(德文版)。 IANAL,但您可能需要翻译和律师,以确保您没有通过抓取页面来违反他们的服务条款。

答案 1 :(得分:0)

编辑: 我的最后一个建议是愚蠢的。

您可以在此处使用stringByUnescapingHTML方法:http://code.google.com/p/statz/source/browse/trunk/NSString%2BHTML.m对其进行解码。 工作代码:

NSString *myStr = [[NSString alloc] initWithString:@"&#69;&#103;&#103;&#101;&#114;&#115;&#100;&#111;&#114;&#102;"];
NSArray* components = [myStr componentsSeparatedByString:@";"];
myStr = @"";
int value;
for (NSString *comp in components){
    unsigned length = [comp length];
    if (length != 0) {
    NSString *numberSequence = [comp substringWithRange:NSMakeRange(2, length - 2)];
    NSScanner *scanner = [NSScanner scannerWithString:numberSequence];
    if ([scanner scanInt: &value] && 
        value < USHRT_MAX &&
        value > 0){
        unichar uchar = value;
        NSString *charString = [NSString stringWithCharacters:&uchar length:1];
        [myStr stringByAppendingString:charString];
    }
    }
}