使用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
相关产品推荐
相关产品推荐

