【问题标题】:npm osmosis. How i can get attr of element?npm 渗透。我怎样才能获得元素的属性?
【发布时间】:2018-12-10 08:00:51
【问题描述】:

页面的部分 HTML 代码

<div name="price" class="detail-price-test">
  <meta itemprop="price" content="3303">
  <meta itemprop="priceCurrency" content="test">
  <span id="price_label">3 303</span><span class="detail-price-test-sign" id="price_label_sign"> eur</span>
  <script>
    if (price_json.price != '0') {
    var price_container = document.getElementById('price_container'),
    price_cheaper_selector = 'detail-price-cheaper';
    document.getElementById('price_label').innerHTML = price_json.price_formatted;
    document.getElementById('price_label_sign').innerHTML = "&thinsp;eur";
    if (parseFloat(price_json.old_price) >
    parseFloat(price_json.price) &&
    price_container &&
    !price_container.hasClass(price_cheaper_selector)
    ) {
    price_container.addClass(price_cheaper_selector);
    }
    }
  </script>
  <link itemprop="availability" href="http://schema.org/InStock">
</div>

1) 第一个问题:如何从 meta itemprop="price" 中提取值为 3303 的 attr 内容? 还是用渗透法做不出来?

2)第二个问题:为什么我不能在这个&lt;span id="price_label"&gt;3 303&lt;/span&gt;中得到值3 303

osmosis
.get('myURL.com')
.find('div.detail-price-test span#price_label') //or div.detail-price-test span[id=price_label]
.set('test')
.data(console.log);

结果在 cosole: test: ''

也许JavaScript 脚本中的问题和渗透不能解决这个问题?

【问题讨论】:

  • 我也签到了cheerio。不要在这个元素上工作 3 303
  • 你好约翰,请看我的回答。您需要更新您的选择器。

标签: javascript node.js cheerio osmosis


【解决方案1】:

在 Cheerio 中是:

$('[itemprop="price"]').attr('content')

在渗透?不知道,我从来没有听说过。

【讨论】:

  • 谢谢,但是在 Cheerio 我已经知道 attr(),我需要了解渗透中的这种可能性
  • 如果我是你,我会删除 osmosis 对你项目的依赖。这是某种爱好图书馆。
  • 不要低估渗透。是的,它有利有弊,但绝对对爬行非常有用。没有任何图书馆能比 osmosis 爬得更快。它有它的目的。那时我使用 request-cheerio。我也尝试过 selenium、puppeteer、nightmare、phantomjs。但我总是回到渗透,每当我需要快速刮掉一些东西时。
【解决方案2】:

您的选择器不正确。

第一个问题答案: 选择器应为:'meta[itemprop="price"]@content' 你可以这样做:

osmosis
.get('myURL.com')
.find('meta[itemprop="price"]@content')
.set('price')
.data(console.log) // {price : 3303}

第二题答案: 正确的选择器是

  1. 'div.detail-price-test &gt; span#price_label'
  2. 'span#price_label'
  3. '#price_label'

做一些类似的事情:

osmosis
.get('myURL.com')
.find('div.detail-price-test > span#price_label')
.set('test')
.data(console.log); // {test : 3...}

【讨论】:

    猜你喜欢
    • 2021-10-07
    • 2021-09-07
    • 2011-06-04
    • 1970-01-01
    • 2017-05-25
    • 2022-01-06
    • 1970-01-01
    • 2021-03-28
    • 1970-01-01
    相关资源
    最近更新 更多