使用nodejssearch非结构化的html
我需要爬行/报废一个静态的非结构化的HTML,我试图得到一个nodejs代码的内容,我尝试使用cheerio和xpath失败。
http://static.puertos.es/pred_simplificada/Predolas/Tablas/Cnt/PAS.html
第一个得到的元素的Xpath是/ html / body / center / center / table / tbody / tr [3],然后我需要在TR中获取每个TD文本。
如果尝试获取tbody节点
var parser = new parse5.Parser(); var document = parser.parse(response.toString()); var xhtml = xmlser.serializeToString(document); var doc = new dom().parseFromString(xhtml); var select = xpath.useNamespaces({"x": "http://www.w3.org/1999/xhtml"}); var nodes = select("//x:tbody", doc);
我总是收到一个[]
节点。
随着cheerio我尝试迭代TR元素,但正如我上面提到的失败。
var $ = cheerio.load(response); $('tr').each(function(i, e) { console.log("Content %j", $(e)); });
它接缝,cheerio无法正常工作与非结构化和没有CSS的HTML。 所以,我尝试了使用YQL的另一个解决方法
select * from html where url='http://static.puertos.es/pred_simplificada/Predolas/Tablas/Cnt/PAS.html' and xpath='//html/body/center/center/table/tbody'
与yql我正在得到我所需要的,所以我将它集成node-yql
使用选项全部小写标记,因为HTML可能包含混合tr
和TR
:
$ = cheerio.load(html, { lowerCaseTags: true });
你也应该为属性做同样的事情:
$ = cheerio.load(html, { lowerCaseTags: true, lowerCaseAttributeNames : true });
希望有所帮助。