【问题标题】:How to use CHEERIO.js for this HTML?如何为这个 HTML 使用 CHEERIO.js?
【发布时间】:2013-11-18 17:25:55
【问题描述】:
<div class="A">
<section class="B" data-vr-zone="B">
    <header class="C"> BarFoo</header>
    <ul class="list">
        <li data-vr-contentbox=""> 
            <a href="http://www.foobar.com/.../html">
                <small>BarBar</small> 
                <span>Foo Bar foobarbar FooFoo?</span>
            </a>

        </li>
        <li data-vr-contentbox=""> 
            <a href="http://www.foofoobar.com/.../html">
                <small>BarBarBar</small> 
                <span>Foo foo FooFoo?</span>
            </a>

        </li>

我想访问 HREF 属性中的 url。而 SPAN 中的文本——仅属于第一个列表项。

我有什么工作,但我正在寻找更好的方法。

var url = $('div .A').children().children().children().children()[0].attribs.href;

var title = $('div .A').children().children().children().children()[0].children[2].children[0].data;

【问题讨论】:

    标签: javascript node.js web-scraping cheerio


    【解决方案1】:

    您想使用更好的选择器字符串来定位感兴趣的元素和属性。你到底有多模糊或精确涉及到与 DOM 结构耦合太紧密的权衡,因此对 HTML 的一些不相关的更改意味着你的选择器不再匹配,或者使用太模糊的选择器并匹配比你想要的更多的东西。

    • 模糊:'a'(找到每个锚点)
    • '.A a'(div 内的每个锚点 class="A")
    • 推荐:'.A li a'(必须是列表的一部分)
    • 疯狂具体:'div.A section.B ul.list li a'

    .

    var link = $('.A li a');
    var href = link.attr('href');
    var spanText = link.find('span').first().text();
    

    【讨论】:

    • 酷!谢谢!抱歉不得不在列表中进行编辑,所以在选择“跨度”时,它会打印出每个“跨度”的文本。你如何抓住第一个'a'下的第一个'SPAN'。假设 'div.A section.B ul.list li a span'.text()'... 但这会打印出所有跨度对象。 find('span') 也获取所有跨度,而不仅仅是第一个
    • 您可以使用 ':first-child' 伪类选择器或 .first() jQuery/Cheerio 方法。
    • 啊是的 .first() 有效! ':first-child' 伪类选择器不起作用,研究告诉我,它只有在目标实际上是第一个孩子并且在这种情况下“小”是“第一个孩子”时才会起作用。跨度>
    猜你喜欢
    • 2021-06-24
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-02
    • 1970-01-01
    相关资源
    最近更新 更多