You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用Objective-C HTMLReader抓取HTML:提取表格行内容与href

用Objective-C HTMLReader抓取老旧表格的href属性方案

嘿,我太懂这种工具文档稀缺、自己踩坑试错的痛苦了!刚好之前用HTMLReader处理过类似的老旧不规范表格,给你一套亲测可行的解决步骤:

1. 先正确加载HTML文档

HTMLReader对不规范HTML的容错性还不错,先把获取到的HTML字符串转成HTMLDocument对象:

// 假设你已经拿到目标页面的HTML字符串htmlString
NSError *loadError = nil;
HTMLDocument *doc = [HTMLDocument documentWithString:htmlString error:&loadError];
if (loadError) {
    NSLog(@"加载HTML失败: %@", loadError.localizedDescription);
    return;
}

2. 精准定位目标表格

你给出的表格有border="1"和bgcolor="#999999"这类独特属性,用属性选择器定位比模糊的标签选择更靠谱:

// 匹配符合属性条件的表格节点
HTMLNode *targetTable = [doc firstNodeMatchingSelector:@"table[border='1'][bgcolor='#999999']"];
if (!targetTable) {
    NSLog(@"没找到目标表格,检查下属性是否匹配页面实际代码");
    return;
}

3. 遍历行提取href

接下来遍历表格的每一行,找到单元格里的<a>标签并提取href属性。如果你的三列表格中href固定在某一列(比如第一列),可以直接定位对应单元格:

// 获取表格所有行(如果有表头行,可改成tr:not(:first-child)排除)
NSArray *tableRows = [targetTable nodesMatchingSelector:@"tr"];

for (HTMLNode *row in tableRows) {
    // 获取当前行的所有单元格
    NSArray *cells = [row nodesMatchingSelector:@"td"];
    // 确保单元格数量符合三列要求
    if (cells.count == 3) {
        // 假设href在第一列,索引0;如果在其他列改索引1或2即可
        HTMLNode *firstCell = cells[0];
        HTMLNode *linkNode = [firstCell firstNodeMatchingSelector:@"a"];
        
        if (linkNode) {
            // 提取href属性值
            NSString *href = [linkNode attributeNamed:@"href"];
            if (href.length > 0) {
                NSLog(@"提取到链接: %@", href);
                // 这里可以把href存入数组或做后续处理
            }
        }
    }
}

备用方案:用XPath直接提取所有href

如果页面结构太乱,CSS选择器不好用,试试XPath表达式直接定位所有符合条件的href,效率更高:

// XPath表达式:找到目标表格下所有行的单元格里的a标签的href属性
NSArray *hrefNodes = [doc nodesMatchingXPath:@"//table[@border='1' and @bgcolor='#999999']/tr/td/a/@href"];

for (HTMLNode *hrefNode in hrefNodes) {
    NSString *hrefValue = hrefNode.value;
    NSLog(@"XPath提取到链接: %@", hrefValue);
}

额外注意点

  • 如果href是相对路径,可以结合原页面URL转成绝对路径:
NSURL *baseURL = [NSURL URLWithString:@"原页面的完整URL"];
NSURL *absoluteLink = [NSURL URLWithString:hrefValue relativeToURL:baseURL];
NSString *absoluteHref = absoluteLink.absoluteString;
  • 老旧页面可能有标签不闭合的情况,HTMLReader一般能处理,但如果遇到极端情况,可以先对HTML字符串做简单的修复(比如补全闭合标签)再加载。

内容的提问来源于stack exchange,提问作者yodel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:37:38