html 为内部带有href的嵌套div遍历div

w9apscun  于 2022-11-27  发布在  其他
关注(0)|答案(1)|浏览(141)
<div class="view-content">
    <div class="views-row views-row-1">   
        <div class="views-field">
            <span class="field-content">
                <a href="link1">Name for link1
                    <img src="image1">
                </a>
            </span>
        </div>
        <div class="views-field-title">
            <span class="field-content">
                <a href="link1">
                </a>
            </span>
        </div>
    </div>
    <div class="views-row views-row-2">
        <div class="views-field">
          <span class="field-content">
              <a href="link2">Name for Link2
                  <img src="image2">
              </a>
          </span>
        </div>
        <div class="views-field-title">
            <span class="field-content">
                <a href="link2">
                </a>
            </span>
      </div>
    </div>

我使用node with request,cheerio来请求数据并相应地抓取。
我正在从link1和link2中寻找href,我让它为一个链接工作,但当我尝试循环它时,它没有向外扩展。

const data ={
       link:"div.views-field > span > a" 
   },
   pageData = {};
   Object.keys(data).forEach(k => {
       pageData[k] = $(data[k]).attr("href");});

     console.log(pageData);
qjp7pelc

qjp7pelc1#

您使用$(data[k]).attr("href");的方法是正确的,但是这里没有循环。应该有2个元素匹配这个选择器,但是您的代码只获取第一个。
将其更改为[...$(data[k])].map(e => $(e).attr("href"))可以从所有匹配元素中获取href属性。
我并不热衷于将pageData作为全局变量,当map看起来更合适的时候,使用forEach,所以我的建议是:

const $ = cheerio.load(html);
const data = {
  link: "div.views-field > span > a",
};
const pageData = Object.fromEntries(
  Object.entries(data).map(([k, v]) =>
    [k, [...$(v)].map(e => $(e).attr("href"))]
  )
);
console.log(pageData);

相关问题