>  기사  >  웹 프론트엔드  >  nodejs에서 HTML을 구문 분석하는 방법을 가르쳐주세요.

nodejs에서 HTML을 구문 분석하는 방법을 가르쳐주세요.

Y2J
Y2J원래의
2017-05-22 10:20:019775검색

nodejs 환경에서 html 파싱

nodejs 환경에서 자매 사진 웹사이트의 데이터를 획득/파싱하고 express를 사용하여 클라이언트에 json을 보냅니다. 데이터.
이 기사는 주로 다음을 해결합니다. 1. 요청된 HTML을 jquery로 구문 분석하는 방법 2. nodejs 환경에서 jquery를 많이 사용하는 사용자를 위한 대체 함수 라이브러리 문제 3. Ajax 요청을 보내는 방법 nodejs 아래(ajax 요청, 그 자체가 요청 요청) 4. 이 글에서는 실제 사례를 사용하여 cheerio를 사용하여 DOM 작업을 수행하는 방법을 소개합니다.

사용자는 npm 모듈:cherio를 설치해야 합니다.
또한 npm 모듈을 사용하는 것이 좋습니다:nodemon, 이는 nodejs 프로그램을 핫 배포할 수 있습니다.

소개

WeChat Mini 프로그램 플랫폼 기본 요구 사항은 다음과 같습니다.
1. 데이터 서버는 https 프로토콜의 서비스인터페이스여야 합니다
2. WeChat 애플릿은 html5가 아닙니다. DOM 구문 분석 및 창 작업을 지원하지 않습니다
3. 테스트 버전은 타사 데이터 서비스 인터페이스를 사용할 수 있지만 공식 버전은 타사 인터페이스 사용을 허용하지 않습니다(물론 여기서는 여러 타사에 대해 이야기합니다). 파티 데이터 인터페이스).

APICLOUD 플랫폼에서 jquery 및 기타 클래스 라이브러리와 함께 html5를 사용하여 dom 데이터 구문 분석을 실현하여 데이터 소스 문제를 해결할 수 있습니다. json 형식이 아닌(jquery를 사용하여 html 아래의 html5로 데이터를 로드하고, apicloud 플랫폼 api를 배울 때 만든 테스트 앱을 다시 정렬하여 정리), WeChat 미니 프로그램 플랫폼에서는 기본적으로 방법이 없습니다. html 요소 를 구문 분석합니다. 이 글을 쓰기 전에 인터넷에서 DOM 구문 분석에 jquery 대신 underscore을 사용하는 방법에 대한 답변을 보았습니다. 오랫동안 작업했는데 여전히 원활하지 않다는 것을 알았습니다.

따라서 이 글에서 제안하는 해결책은 두 가지 문제를 해결하는 것입니다:
1. 자체 서버를 사용하여 타사 웹사이트의 HTML 데이터 변환 서비스를 자체 WeChat 애플릿에 제공합니다. party HTML 요소는 필요한 요소를 구문 분석합니다. nodejs 플랫폼에서 request 모듈을 사용하여 데이터 요청을 완료하고 cheerio 모듈을 사용하여 html 구문 분석을 완료합니다.
2. nodejs 플랫폼 아래에는 jquery 모듈이 있지만 사용하는데 여전히 문제가 많습니다. 인터넷에 nodejs 환경에서 jquery를 사용하는 방법을 알려주는 글이 있는데, 실제 테스트를 해보니 코드 작성을 원활하게 시작할 수 없다는 것을 알게 되었습니다.

따라서 이 기사의 작성 아이디어는 다음과 같습니다. 1. 데이터 소스를 분석합니다. 2. request을 간략하게 소개합니다. 3. cheerio 모듈의 일반적인 방법을 간략하게 소개합니다. json 데이터를 제공하려면 express 모듈을 사용하세요.

데이터 소스 분석

데이터 목록 분석

대부분의 프로그램 루틴에 따르면 타사 데이터 소스에 대한 작업은 대부분 크롤러 사례이므로 이 기사에서는 그 사례를 설명합니다. 똑같아야 한다. 홈보이들에게는 축복이다. 이 글의 대상 주소는 http://m.mmjpg.com.

nodejs에서 HTML을 구문 분석하는 방법을 가르쳐주세요.

이 글의 자료 출처는 순위 페이지입니다. 순위 페이지는 다음과 같습니다.
enter description here

하단의 스크롤바를 밀면 더 보기 버튼을 찾을 수 있습니다, Load More를 클릭하면 브라우저 콘솔에서 브라우저가 url에 대한 요청을 http://m.mmjpg.com/getmore.php?te=1&page=3
nodejs에서 HTML을 구문 분석하는 방법을 가르쳐주세요.

브라우저로 보낸 것을 확인할 수 있습니다. 콘솔에 표시되는 내용은 다음과 같습니다.


enter description here브라우저를 사용하여 위 링크(
)를 열 수 있습니다. 이 링크는 제가 이 글을 작성할 때 액세스한 링크입니다. 그 당시 브라우저에서 얻은 시간 데이터(독자가 브라우저에 직접 액세스할 때 내 데이터와 다른 데이터를 얻을 수 있음) http://m.mmjpg.com/getmore.php?te=1&page=3아래 그림에서는 다음 내용을 포함하여 페이지 소스 코드에 데이터를 표시했습니다. 1. 제목 2. 모든
사진 검색 주소 4; .출시 시간 5. 좋아요 수
enter description here

데이터 상세 페이지 분석

위의 추가 페이지를 로드하기 위해 접속했을 때, page=3 목록의 페이지에서 다음 링크http://m.mmjpg.com/mm/958를 클릭했는데, 해당 제목은 亮丽清纯妹子冰露纯天然的G杯巨乳美图입니다. .

enter description here

위 사진을 보면 http://m.mmjpg.com/mm/958/<a href="http://www.php.cn/wiki/58.html" target="_blank">数组</a>序号 페이지마다 이미지가 있는 것을 알 수 있는데, 이 이미지의 주소도 매우 표준화되어 있는데, 바로 http://img.mmjpg.com/2017/958/1.jpg 입니다. 다음은 매우 간단합니다. 현재 사진 컬렉션에 몇 장의 사진이 있는지만 알면 규칙에 따라 모든 사진의 주소를 연결할 수 있습니다. 여기서는 세부정보 페이지의 데이터를 얻으려면 첫 번째 사진 페이지의 데이터만 얻으면 됩니다. 얻은 주요 데이터는 第(1/N)张classcontent의 p 아래 첫 번째 img 태그의 src라는 것입니다.

글쎄, 위에서 데이터 소스에 대한 소개는 모두 끝났습니다. 다른 데이터 소스에 대한 분석도 같은 아이디어를 따릅니다. 독자라면 누구나 원하는 데이터를 얻을 수 있을 것이라 믿습니다.

요청 모듈 소개

request 모듈을 사용하면 http요청이 더 쉬워집니다.

가장 간단한 예:

var request = require(&#39;request&#39;); 
request(&#39;http://www.google.com&#39;, function (error, response, body) {
    if (!error && response.statusCode == 200) {
        console.log(body);
    }
})

인터넷에서 이미지를 가져와 로컬에 저장합니다.

var fs=require(&#39;fs&#39;);var request=require(&#39;request&#39;);
request(&#39;http://n.sinaimg.cn/news/transform/20170211/F57R-fyamvns4810245.jpg&#39;).pipe(fs.createWriteStream(&#39;doodle.png&#39;));

로컬 file.json 파일을 mysite.com/obj에 업로드합니다
fs.createReadStream(&#39;file.json&#39;).pipe(request.put(&#39;http://mysite.com/obj.json&#39;))

google.com/img.png를 mysite.com/img.png에 업로드

request.get(&#39;http://google.com/img.png&#39;).pipe(request.put(&#39;http://mysite.com/img.png&#39;))

service.com/upload에 양식 제출

var r = request.post(&#39;http://service.com/upload&#39;)var form = r.form()
form.append(&#39;my_field&#39;, &#39;my_value&#39;)
form.append(&#39;my_buffer&#39;, new Buffer([1, 2, 3]))
form.append(&#39;my_file&#39;, fs.createReadStream(path.join(dirname, &#39;doodle.png&#39;))
form.append(&#39;remote_file&#39;, request(&#39;http://google.com/doodle.png&#39;))

HTTP 인증

request.get(&#39;http://some.server.com/&#39;).auth(&#39;username&#39;, &#39;password&#39;, false);

맞춤형 HTTP 헤더

//User-Agent之类可以在options对象中设置。var options = {
 url: &#39;https://api.github.com/repos/mikeal/request&#39;,
 headers: { &#39;User-Agent&#39;: &#39;request&#39;
 }
};function callback(error, response, body) {
 if (!error && response.statusCode == 200) { var info = JSON.parse(body);
 console.log(info.stargazers_count +"Stars");
 console.log(info.forks_count +"Forks");
}
}
request(options, callback);

cheerio 모듈 소개

cheerio는 서버에 맞게 특별히 맞춤화된 빠르고 유연하며 구현된 jQuery 코어 구현입니다.

Cheerio는 npm 공식 웹사이트에서 사용할 수 있습니다. 모듈 소개 : www.npmjs.com/package/cheerio

영문을 읽는 데 문제가 있는 경우 nodejs 중국 커뮤니티의 Cherio API에 대한 중국어 소개:

cnodejs.org/topic/5203a71844e76d216a727d2e

jquery 비교

사실

을 사용하여 nodejs에서 const cheerio = require('cheerio'); 모듈을 로드하는 경우 HTML 소스 cheerio 문자열 을 매개변수로 사용하고 cheerio을 사용합니다. 함수가 로드되면 load 환경에서 jquery프로그래밍 아이디어를 완전히 따라가서 DOM 구문 분석을 실현할 수 있습니다.

모듈은 cheerio의 기능을 대부분 구현하므로 여기서는 이에 대한 자세한 소개를 생략하겠습니다. jquery

코드를 기반으로 데이터를 얻는 방법을 설명하세요

위의 분석을 통해 우리의 데이터 소스는

이 아니라 json인 것을 알 수 있습니다. 🎜>는 html 요청을 보낼 때 jqueryhtml으로 설정해야 합니다. ajaxdataType주요 프로세스(jquery): text1. ajax 요청을 사용하고 url을 전달하고 dataType을 설정합니다.

2.

에서 얻은 데이터를
로 변환합니다. 물체.
3. $(data)ajaxjquery 메소드를 사용하여 획득에 필요한 요소를 찾습니다.
4. jqueryfindget 메소드를 사용하여 필요한 정보를 얻습니다.
5. 위 정보를 json 문자열에 통합하거나 jquery에서 attr 작업을 수행하여 데이터 로드를 완료합니다. html
주요 프로세스(nodejs): html1. 요청을 사용하여 URL을 전달하고 데이터 유형을 설정합니다. dom2.

에서 얻은 데이터를

개체.
3.
cheerio.load(body)request 메소드를 사용하여 획득에 필요한 요소를 찾습니다. cheerio4.
cheeriofind 메소드를 사용하여 필요한 정보를 얻습니다. get5. 위의 정보를 json 문자열로 통합하고
cheerio을 사용하여 클라이언트(미니 프로그램 또는 기타 APP)에 json을 응답합니다. attrtext코드로 직접 이동
expressnodejs에서 이미지 목록 가져오기 및 구문 분석res.json

var express = require(&#39;express&#39;);var router = express.Router();var bodyParser = require("body-parser");var http = require(&#39;http&#39;);const cheerio = require(&#39;cheerio&#39;);/* GET home page. */router.get(&#39;/&#39;, function (req, res, next) {
    res.render(&#39;index&#39;, {title: &#39;Express&#39;});
});/* GET 妹子图列表  page. */router.get(&#39;/parser&#39;, function (req, res, next) {


    var json =new Array();    var url = `http://m.mmjpg.com/getmore.php?te=0&page=3`;
    var request = require(&#39;request&#39;);
    request(url, function (error, response, body) { if (!error && response.statusCode == 200) {        var $ = cheerio.load( body );//将响应的html转换成cheerio对象
        var $lis = $(&#39;li&#39;);//便利列表页的所有的li标签,每个li标签对应的是一条信息
        var json = new Array();//需要返回的json数组
        var index = 0;
        $lis.each(function () {
            var h2 = $(this).find("h2");//获取h2标签,方便获取h2标签里的a标签
            var a = $(h2).find("a");//获取a标签,是为了得到href和标题
            var img = $(this).find("img");//获取预览图
            var info =$($($(this).find(".info")).find("span")).get(0);//获取发布时间
            var like = $(this).find(".like");//获取点赞次数

            //生成json数组
            json[index] = new Array({"title":$(a).text(),"href":$(a).attr("href"),"image":$(img).attr("data-img"),"timer":$(info).text(),"like":$(like).text()});
            index++;
        })        //设置响应头
        res.header("contentType", "application/json");        //返回json数据
        res.json(json);
        }
    });

})
;/**
 * 从第(1/50)张这样的字符串中提取50出来
 * @param $str
 * @returns {string}
 */function getNumberFromString($str) {
    var start = $str.indexOf("/");    var end = $str.indexOf(")");    return $str.substring(start+1,end);
}/* GET 妹子图所有图片  page. */router.get(&#39;/details&#39;, function (req, res, next) {

    var json;    var url = `http://m.mmjpg.com/mm/958`;
    var request = require(&#39;request&#39;);
    request(url, function (error, response, body) {
        if (!error && response.statusCode == 200) {        var $ = cheerio.load( body );//将响应的html转换成cheerio对象

        var json = new Array();//需要返回的json数组
        var index = 0;        var img = $($(".content").find("a")).find("img");//每一次操作之后得到的对象都用转换成cheerio对象的
        var imgSrc = $(img).attr("src");//获取第一张图片的地址
        var title = $(img).attr("alt");//获取图片集的标题
        var total  =$($(".contentpage").find("span").get(1)).text();//获取‘第(1/50)张’
        total = getNumberFromString(total);//从例如`第(1/50)张`提取出50来
        var imgPre = imgSrc.substring(0,imgSrc.lastIndexOf("/")+1);//获取图片的地址的前缀
        var imgFix = imgSrc.substring(imgSrc.lastIndexOf("."));//获取图片的格式后缀名
        console.log(imgPre + "\t" + imgFix);        //生成json数组
        var images= new Array();        for(var i=1;i<=total;i++) {
            images[i-1] =imgPre+i+imgFix;
        }
        json = new Array({"title":title,"images":images});        //设置响应头
        res.header("contentType", "application/json");        //返回json数据
        res.json(json);
    }
    });

})
;

module.exports = router;

탐색하는 동안 목록 페이지의 json을 가져오면 스크린샷은 다음과 같습니다.

세부정보 페이지의 json을 가져옵니다. 스크린샷은 다음과 같습니다.

enter description here

위 json은 형식이 확인되었습니다. 그리고 유효합니다.

enter description here

apicloud平台下利用jquery实现的代码

//获取妹子图的列表function loadData() {
    url = &#39;http://m.mmjpg.com/getmore.php&#39;;
    $.ajax({
        url: tmpurl,
        method: &#39;get&#39;,
        dataType: "application/text",
        data:{
            te:0,
            page:3
        },
        success: function (data) {
            if (data) {
                ret = "<ul>" + ret + "</ul>";                var lis = $(ret).find("li");                var one = &#39;&#39;;
                $(lis).each(function () {
                    var a = $(this).find("h2 a");                    var ahtml = $(a).html();//标题
                    var ahref = $(a).attr(&#39;href&#39;);//链接
                    var info = $(this).find(".info");                    var date = $($(info).find("span").get(0)).html();                    var like = $($(info).find(".like")).html();                    var img = $(this).find("img").get(0);                    var imgsrc = $(img).attr(&#39;data-img&#39;);                    //接下来,决定如何对数据进行显示咯。如dom操作,直接显示。
                });
            } else {
                alert("数据加载失败,请重试");
            }
        }
    });
};//end of loadData//图片详情页的获取,就不再提供jquery版本的代码了

总结

本文主要解决了:1.jquery解析请求过来的html如何实现的问题;2.nodejs环境下jquery重度使用者的替代函数库的问题;3.nodejs下,如何发送ajax请求的问题(ajax请求,本身就是一个request请求);4. 本文用实际的案例来介绍了如何使用cheerio进行dom操作。

【相关推荐】

1. HTML免费视频教程

2. html实现消息按钮上的数量角标的实例详解

3. html中怎么样才能让JSON数据显示的方法介绍

4. 对HTTP Headers知识点的图文说明

5. XHTML中的超链接标签使用教程

위 내용은 nodejs에서 HTML을 구문 분석하는 방법을 가르쳐주세요.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.