使用nodejs对非结构化html进行爬网

时间:2015-11-01 20:20:42

标签: node.js xpath web-crawler cheerio

我需要抓取/删除静态非结构化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));
});

2 个答案:

答案 0 :(得分:2)

如果没有结构化且没有CSS HTML,那么cheerio无法正常工作。所以,我在that tutorial

之后使用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

答案 1 :(得分:0)

使用选项所有小写标记,因为HTML可能包含混合TR $ = cheerio.load(html, { lowerCaseTags: true });

 $ = cheerio.load(html, { lowerCaseTags: true, lowerCaseAttributeNames : true });

你也应该为属性做同样的事情:

<!doctype HTML>
<html>

<head>
    <title>HUSTLE PAY$</title>
    <meta name="viewport" content="width = device - width, initial scale=1.0">
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.3/jquery.min.js"></script>

希望有所帮助。