Извлечь данные из html javascript nodejs? - PullRequest
0 голосов
/ 20 марта 2012

Я работаю над созданием CLI для поиска в Google для себя, и некоторое время я использовал nodejs, работая над чат-ботом, поэтому я бы хотел, чтобы он работал с nodejs. Я могу вытащить данные очень хорошо, и в итоге получится строка, содержащая все HTML-данные со страницы. В html даже легко разобраться, какие результаты мне нужны:

<div class="jd"><a class="p" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://leagueoflegends.com/&amp;ved=0CBAQFjAA&amp;usg=AFQjCNEEnWGHwxNnuwKenqm4ajKfTM6Xxw" ><b>League of Legends</b> - Free Online Game | <b>LoL</b> - <b>League of Legends</b></a> </div> <div class="kd">3 days ago&nbsp;… Official website for <b>League of Legends</b>. Join millions of players in an award   winning Multiplayer Online Battle Arena. </div> <div class="qdlmxn"><a class="gg" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://leagueoflegends.com/board&amp;ved=0CBEQ0gIoADAA&amp;usg=AFQjCNHpmmAdFFbTgm8C_gJvsjVhMzVKUQ" >Community</a> - <a class="gg" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://signup.leagueoflegends.com/en/signup/redownload&amp;ved=0CBIQ0gIoATAA&amp;usg=AFQjCNFHGUtn4ItgQIzODgIZRv_237Mq0A" >PVP.NET</a> - <a class="gg" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://na.leagueoflegends.com/board/forumdisplay.php?f%3D2&amp;ved=0CBMQ0gIoAjAA&amp;usg=AFQjCNHpycJ8WGh7xvWw1qNu8NjjU1EA0Q" >General Discussion</a> - <a class="gg" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://na.leagueoflegends.com/champions&amp;ved=0CBQQ0gIoAzAA&amp;usg=AFQjCNEpeBzNefwag5xmkFcFhCW27FoAew" >Champions</a> </div><span class="c">leagueoflegends.com/</span> -  <div class="txnles" onclick="_popup('web_result_popup_10836585','inline');"> <div class="wx4xyp" id="web_result_popup_10836585"> <div class="vfc7iu"><a class="s" href="/search?q=cache:GCRD1wy5e3QJ:leagueoflegends.com/" >Cached</a> <br/><a class="s" href="/m/?q=related:leagueoflegends.com/&amp;ei=ZtZnT8CTOMy48AbDzgE&amp;ved=0CBYQHzAA" >Similar</a> <br/><a class="s" href="/gwt/x?q=lol&amp;ei=ZtZnT8CTOMy48AbDzgE&amp;hl=en&amp;source=m&amp;u=http://leagueoflegends.com/" >Mobile formatted</a> </div> </div><a class="s" href="javascript:void(0)" >Options</a> <div class="m6u8fq"> </div> </div> </div> </div> <div> <div class="r ld"> <div class="jd"><a class="p" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://en.wikipedia.org/wiki/LOL&amp;ved=0CBgQFjAB&amp;usg=AFQjCNFOhgg5Y2E5SFuS5I-8830OJ9VR9Q" ><b>LOL</b> - Wikipedia, the free encyclopedia</a> </div> <div class="kd"><b>LOL</b>, an abbreviation for <b>laughing out loud</b>, or <b>laugh out loud</b>, is a common   element of Internet slang. It was used historically on Usenet&nbsp;… </div><span class="c">en.wikipedia.org/wiki/LOL</span> -  <div class="txnles" onclick="_popup('web_result_popup_30597472','inline');"> <div class="wx4xyp" id="web_result_popup_30597472"> <div class="vfc7iu"><a class="s" href="/search?q=cache:mhIpOeXQp38J:en.wikipedia.org/wiki/LOL" >Cached</a> <br/><a class="s" href="/m/?q=related:en.wikipedia.org/wiki/LOL&amp;ei=ZtZnT8CTOMy48AbDzgE&amp;ved=0CBkQHzAB" >Similar</a> <br/><a class="s" href="/gwt/x?q=lol&amp;ei=ZtZnT8CTOMy48AbDzgE&amp;hl=en&amp;source=m&amp;u=http://en.wikipedia.org/wiki/LOL" >Mobile formatted</a> </div> </div><a class="s" href="javascript:void(0)" >Options</a> <div class="m6u8fq"> </div> </div> </div> </div> <div> <div class="r ld">

Все, что является .jd, является результатом, поэтому мне сначала нужно отделить их, а затем поработать над разделением URL-адресов и описаний. Я никогда не занимался строковыми манипуляциями до такой степени, поэтому понятия не имею, с чего начать.

Вот HTML-код в более читаемом формате, хотя я понимаю, что я имею дело только с одной длинной строкой.

<div>
  <div class="r ld">
    <div class="jd">
      <a class="p" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://leagueoflegends.com/&amp;ved=0CBAQFjAA&amp;usg=AFQjCNEEnWGHwxNnuwKenqm4ajKfTM6Xxw" >
        <b>League of Legends</b> - Free Online Game | <b>LoL</b> - <b>League of Legends</b>
      </a>
    </div>
    <div class="kd">
      3 days ago&nbsp;… Official website for <b>League of Legends</b>. Join millions of players in an award   winning Multiplayer Online Battle Arena. 
    </div>
    <div class="qdlmxn">
      <a class="gg" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://leagueoflegends.com/board&amp;ved=0CBEQ0gIoADAA&amp;usg=AFQjCNHpmmAdFFbTgm8C_gJvsjVhMzVKUQ" >Community</a> - 
      <a class="gg" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://signup.leagueoflegends.com/en/signup/redownload&amp;ved=0CBIQ0gIoATAA&amp;usg=AFQjCNFHGUtn4ItgQIzODgIZRv_237Mq0A" >PVP.NET</a> - 
      <a class="gg" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://na.leagueoflegends.com/board/forumdisplay.php?f%3D2&amp;ved=0CBMQ0gIoAjAA&amp;usg=AFQjCNHpycJ8WGh7xvWw1qNu8NjjU1EA0Q" >General Discussion</a> - 
      <a class="gg" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://na.leagueoflegends.com/champions&amp;ved=0CBQQ0gIoAzAA&amp;usg=AFQjCNEpeBzNefwag5xmkFcFhCW27FoAew" >Champions</a> 
    </div>
    <span class="c">leagueoflegends.com/</span> -  
    <div class="txnles" onclick="_popup('web_result_popup_10836585','inline');">
      <div class="wx4xyp" id="web_result_popup_10836585"> <div class="vfc7iu">
        <a class="s" href="/search?q=cache:GCRD1wy5e3QJ:leagueoflegends.com/" >Cached</a> 
        <br/>
        <a class="s" href="/m/?q=related:leagueoflegends.com/&amp;ei=ZtZnT8CTOMy48AbDzgE&amp;ved=0CBYQHzAA" >Similar</a> 
        <br/>
        <a class="s" href="/gwt/x?q=lol&amp;ei=ZtZnT8CTOMy48AbDzgE&amp;hl=en&amp;source=m&amp;u=http://leagueoflegends.com/" >Mobile formatted</a> 
      </div> 
    </div>
    <a class="s" href="javascript:void(0)" >Options</a> 
    <div class="m6u8fq"> </div> 
    </div> 
  </div> 
</div> 
<div> 
  <div class="r ld"> 
    <div class="jd">
      <a class="p" href="/m/url?ei=ZtZnT8CTOMy48AbDzgE&amp;q=http://en.wikipedia.org/wiki/LOL&amp;ved=0CBgQFjAB&amp;usg=AFQjCNFOhgg5Y2E5SFuS5I-8830OJ9VR9Q" >
        <b>LOL</b> - Wikipedia, the free encyclopedia
      </a>
    </div>
    <div class="kd">
      <b>LOL</b>, an abbreviation for <b>laughing out loud</b>, or <b>laugh out loud</b>, is a common   element of Internet slang. It was used historically on Usenet&nbsp;… 
    </div>
    <span class="c">en.wikipedia.org/wiki/LOL</span> -  
    <div class="txnles" onclick="_popup('web_result_popup_30597472','inline');"> 
      <div class="wx4xyp" id="web_result_popup_30597472"> 
        <div class="vfc7iu">
          <a class="s" href="/search?q=cache:mhIpOeXQp38J:en.wikipedia.org/wiki/LOL" >Cached</a> 
          <br/>
          <a class="s" href="/m/?q=related:en.wikipedia.org/wiki/LOL&amp;ei=ZtZnT8CTOMy48AbDzgE&amp;ved=0CBkQHzAB" >Similar</a> 
          <br/>
          <a class="s" href="/gwt/x?q=lol&amp;ei=ZtZnT8CTOMy48AbDzgE&amp;hl=en&amp;source=m&amp;u=http://en.wikipedia.org/wiki/LOL" >Mobile formatted</a> 
        </div> 
      </div>
      <a class="s" href="javascript:void(0)" >Options</a> 
      <div class="m6u8fq"> </div> 
    </div> 
  </div> 
</div>

Ответы [ 2 ]

0 голосов
/ 04 марта 2017

так что я был в такой же ситуации, но с XML, и я создал этот анализатор HTML / XML для своих собственных нужд.

я пытался сделать так, чтобы это выглядело как модель манипулирования DOM в браузере, поэтому большинство вещей работает одинаково

Сначала просто скопируйте вставку в ваш js-файл.не забудьте объявить «используйте строгий»;в начале файла.

class Node {
    constructor(nodeName, nodeType) {
        this.nodeName = nodeName;

        this.nodeType = nodeType;
        this.attributes = {};
        this.childNodes = [];
        this.parentNode = null;


    }

    removeChild(node) {
        if (node.parentNode != null) {
            for (var i = 0; i < this.childNodes.length; i++) {
                if (node == this.childNodes[i]) {
                    this.childNodes.splice(i, 1);
                    node.parentNode = null;
                }
            }
        }
    }

    appendChild(child) {
        if (child.parentNode == null) {
            this.childNodes.push(child);
            child.parentNode = this;

        } else {
            child.parentNode.removeChild(child);
            this.childNodes.push(child);
            child.parentNode = this;

        }
    }

    returnMyChildNodes() {
        return this.childNodes;
    }

    returnElementCollection() {
        var array = [];
        array.push(this);
        for (var i = 0; i < this.childNodes.length; i++) {
            var tmparray = [];
            tmparray = this.childNodes[i].returnElementCollection();
            array = array.concat(tmparray);
        }

        return array;
    }

    getELementsByAttributeValue(attribute, value) {
        var matchedElements = [];
        var Elements = this.returnElementCollection();
        console.log(Elements.length);
        for (var i = 0; i < Elements.length; i++) {
            if (typeof Elements[i].attributes[attribute] != "undefined") {
                if (Elements[i].attributes[attribute] == value) {
                    matchedElements.push(Elements[i]);
                }
            }
        }

        return matchedElements;
    }

}

Этот объект узла будет действовать как HTML-узлы.поэтому мы объявляем еще один класс здесь.

class Html_Node extends Node {
    constructor(name) {
        super(name, "HTML_ELEMENT");
    }

    toString() {

    }
}

class Xml_Node extends Node {
    constructor(name) {
        super(name, "XML_ELEMENT");

        this.innerText = "";
    }

}

после того, как у нас есть классы для обоих, мы переходим к сложной части. Читаем документ и строим наши узлы в 1 документе

class XML_Reader {
    constructor() {
        this.rawContents = "";
        this.Document = null;
    }

    loadXML(documentPath) {
        if (documentPath != null && documentPath != "") {
            var fs = require("fs");
            var fc = fs.readFileSync(documentPath, {
                encoding: "utf-8"
            });
            if (typeof fc != "undefined" && fc != null) {
                this.rawContents = fc;
            } else {
                this.rawContents = null;
            }

            delete require.cache[require.resolve("fs")];
        } else {
            this.rawContents = null;
        }


    }

    processXML() {

        var XML_DOC = new Xml_Node("root");
        var rawElements = [];
        var TagStart_index = 0;
        var TagEnd_index = 0;

        var innerContent_Start = 0;
        var innerContent_End = 0;
        for (var i = 0; i < this.rawContents.length; i++) {
            // get starting tags
            if (this.rawContents[i] == "<") {
                TagStart_index = i;
                innerContent_End = i - 1;

                var innerContent = "";
                if (innerContent_End > innerContent_Start) {
                    for (var n = innerContent_Start; n <= innerContent_End; n++) {
                        innerContent += this.rawContents[n];
                    }

                    if (/\S/.test(innerContent)) {
                        // do smth with innerContent of tag
                        rawElements.push(innerContent);
                    }
                }


            } else if (this.rawContents[i] == ">") {

                TagEnd_index = i;
                innerContent_Start = i + 1;
                var contents = "";

                for (var n = TagStart_index; n <= TagEnd_index; n++) {
                    contents += this.rawContents[n];
                }

                rawElements.push(contents);
            }

        }

        var currentParent = XML_DOC;
        for (var i = 0; i < rawElements.length; i++) {
            if (/>/.test(rawElements[i]) && /</.test(rawElements[i])) {
                if (rawElements[i].indexOf("/") == 1) {
                    currentParent = currentParent.parentNode;

                } else {
                    var str = rawElements[i];
                    str = str.replace("<", "");
                    str = str.replace(">", "");
                    var IgnoreSpace = false;
                    var tempString = "";
                    var InnerNodeContents = [];
                    var wordIndex = 0;
                    for (var n = 0; n < str.length; n++) {
                        if (!IgnoreSpace) {

                            if (str[n] == "/") {
                                InnerNodeContents[wordIndex] = tempString;
                                tempString = "";
                                wordIndex++;
                            }
                            if (n + 1 == str.length) {
                                tempString +=
                                    str[n];
                                InnerNodeContents[wordIndex] = tempString;
                                tempString = "";
                                wordIndex++;
                            } else if (!/\S/.test(str[n])) {
                                InnerNodeContents[wordIndex] = tempString;
                                tempString = "";
                                wordIndex++;
                            } else {
                                tempString += str[n];
                            }

                            if (str[n] == '"') IgnoreSpace = true;

                        } else {
                            if (str[n] == "/") {
                                InnerNodeContents[wordIndex] = tempString;
                                tempString = "";
                                wordIndex++;
                            }
                            if (n + 1 == str.length) {
                                tempString += str[n];
                                InnerNodeContents[wordIndex] = tempString;
                                tempString = "";
                                wordIndex++;
                            } else {
                                tempString += str[n];
                            }
                            if (str[n] == '"') IgnoreSpace = false;

                        }
                    }

                    var node = new Xml_Node(InnerNodeContents[0]);

                    // add attributes
                    var switchParent = false;

                    if (InnerNodeContents[InnerNodeContents.length - 1] == "/") {
                        switchParent = true;

                        for (var n = 1; n < InnerNodeContents.length - 1; n++) {
                            var tmparray = InnerNodeContents[n].split("=");
                            node.attributes[tmparray[0]] = tmparray[1].replaceAll('"', "");
                        }
                    } else {

                        for (var n = 1; n < InnerNodeContents.length; n++) {
                            var tmparray = InnerNodeContents[n].split("=");
                            node.attributes[tmparray[0]] = tmparray[1].replaceAll('"', "");
                        }
                    }

                    currentParent.appendChild(node);
                    if (!switchParent) currentParent = node;


                }
            } else {
                currentParent.innerText = rawElements[i];
            }

        }

        this.Document = XML_DOC;

    }

}

, а затем все, что нам нужно сделать, это:

var xr = new XML_Reader();
xr.loadXML("Path to HTML file");
xr.processXML();

var Elements = xr.Document.getElementsByAttributeValue("class", "jd"); 

и теперь у вас есть элемент Everysingle с классом jd в этой переменной Element.

и затем, чтобы получить URL каждого из них, вы будете выполнять цикл FOR и получать атрибут href

var myUrl = Elements[0].attributes.href;

Я сделал этот скрипт для себя, поэтому не стесняйтесь использовать его:)

еще одна вещь.чтобы получить потомков DIV с классом JD, вам нужно получить этот div и найти nodeNames (a) и получить атрибуты наследника href.

0 голосов
/ 20 марта 2012

Luxun привел меня обратно к API Google, и я узнал, как искать полные веб-результаты вместо просто включенных сайтов здесь: http://support.google.com/customsearch/bin/answer.py?hl=en&answer=1210656

To create a search engine that searches the entire web:

From the Google Custom Search homepage, click Create a Custom Search Engine.
Type a name and description for your search engine.
Under Define your search engine, in the Sites to Search box, enter at least one valid URL (e.g. www.google.com).
Select the CSE edition you want and accept the Terms of Service, then click Next. Select the layout option you want, and then click Next.
Click any of the links under the Next steps section to navigate to your Control panel.
In the left-hand menu, under Control Panel, click Basics.
In the Search Preferences section, select Search the entire web but emphasize included sites.
Click Save Changes.
In the left-hand menu, under Control Panel, click Sites.
Delete the site you entered during the initial setup process.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...