【问题标题】:How can I crawl values of variable sub-elements using jquery如何使用 jquery 抓取变量子元素的值
【发布时间】:2014-12-18 09:59:49
【问题描述】:

我正在使用 node.js 编写一个爬虫来学习,并爬取数据以供将来使用。我知道如何抓取页面中的单个元素,但是经过一整天的研究,我无法弄清楚如何获取可变子元素的值。

这是我要抓取的 HTML 部分。 'attrgroup' 的每个子元素都有不同的

<p class="attrgroup">
<span><b>4</b>BR / <b>1</b>Ba</span>
<span><b>1200</b>ft<sup>2</sup></span>
<span>duplex</span> 
<span>laundry on site</span> 
<span>street parking</span>
<br><span>cats are OK - purrr</span></p>

这是我的代码

            topics = topics.map(function (topicPair) {

                var topicUrl = topicPair[0];
                var topicHtml = topicPair[1];
                var $ = cheerio.load(topicHtml);
                return ({
//[1]I got correct value,such as duplex, using following clauses.
                  att1: $('.attrgroup').children().eq(0).text().trim(),
                  att2: $('.attrgroup').children().eq(1).text().trim(),
                  att3: $('.attrgroup').children().eq(2).text().trim(),
//[2]I want all of them,but.each function doesn't return the correct data
                  atts: $('.attrgroup').children().each(function(){
                    $(this).text()
                  }),
                });
            });

我得到这样的结果:

att1: '4BR / 1Ba',
att2: '1200ft2',
att3: 'duplex'
atts:  { '0': [Object],
       '1': [Object],
       '2': [Object],
       '3': [Object],
       '4': [Object],
       '5': [Object],
       options: [Object],
       _root: [Object],
       length: 7,
       prevObject: [Object] },

目前,我知道原因可能是 $(this),一个 jquery 对象。我试图将它转换为 DOM 对象,但也不起作用。 任何人都可以帮助我纠正我的那部分代码,或者告诉我如何修复它。它不必使用每种方法,任何方法都可以使用。或者提示也会有很大帮助。提前致谢!

【问题讨论】:

  • 你应该写一个recursive function来遍历DOM树并提取文本内容。
  • 通过查看您的代码,您希望每个函数做什么? $.each 迭代匹配的集合并返回可链接的集合。我猜你想做Array.prototype.reduce.call($('.attrgroup').children(), function (prev,cur) {return prev + $(cur).text()}, "");之类的事情,请参阅Array.prototype.reduce MDN doc,或者只使用Array.prototype.map
  • 我想返回 attrgroups 的所有子元素,而这些 attrgroups 有不同数量的子元素。我真的不知道如何使用你提到的方法。反正现在已经解决了。感谢您的帮助

标签: javascript jquery html node.js


【解决方案1】:

也许是这样的?

return (function () {

    var object = {};

    $('.attrgroup').children().each(function(i, element){
        object["att" + i] = $(element).text().trim();
    });

    return object;

})();

【讨论】:

  • 完美,这正是我要做的。非常感谢。
猜你喜欢
  • 2011-10-30
  • 2021-05-07
  • 1970-01-01
  • 1970-01-01
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多