如何使用Puppeteer在<a href>标记内获取文本而在href中没有链接

时间:2019-06-13 00:53:24

标签: html testing web-scraping puppeteer

我正在尝试在标签内抓取一些日期,但我不想获取标签内的链接。

由于标签没有ID或类,因此不太确定如何解决该问题

<div id="list-section">
    <ul>
        <li data-store-id="1234">
            <div class="item">
                <p>
                    <strong>
                    <a target="_blank" href="www.somelink.com"> NAME ONE </a>
                    </strong>
                </p>
            </div>
        </li>
        <li data-store-id="1234">
            <div class="item">
                <p>
                    <strong>
                    <a target="_blank" href="www.somelink.com"> NAME TWO </a>
                    </strong>
                </p>
            </div>
        </li>
    </ul>
</div>

我正在尝试将数组中的每个名称都放在[NAME ONE,NAME TWO]等末尾。

编辑:将节点与木偶一起使用

2 个答案:

答案 0 :(得分:2)

有一种方法可以找到名为xpath的Web报废时非常有用的元素。从未与puppeteer一起工作,但是最近我与selenium一起工作了很多,而我经常使用xpath。

快速浏览puppeteer的文档,我发现了一些可能对您有用的东西。

https://github.com/GoogleChrome/puppeteer/blob/master/docs/api.md#pagexexpression

由于我没有完整的html页面,因此我可以制作一个简单的xPath来演示其功能。

//div[@class='item']//a

您还可以测试xpath,在“ Elements”标签中打开Goog​​le Chrome DevTools,然后按CTRL + F

这是用于抓取网页的好工具。

答案 1 :(得分:1)

您可以通过两个步骤将名称包含在数组中:

  • 选择定位标记<a>...</a>
  • 获取内部HTML

正如道格拉斯之前提到的,您可以使用XPath,但是在这种情况下,简单的CSS选择器就可以完成工作。作为CSS选择器,许多组合都可以为您提供定位标记:#list-section aul a ...

选择最适合您并且以后刹车的可能性最小的那个。 我建议使用第一个:

const anchorTags = await page.$$("#list-section a")

关于获取元素的内部HTML,此SO question绝对会为您提供帮助。我的首选方法是定义一个单独的异步函数,如下所示:

async function getInnerHtml(page, target){
  const innerHTML = await page.evaluate(el => el.innerHTML, target)
  return innerHTML
}

这样,您将在数组上循环并在锚标记上调用它。

不要忘记,总是有很多方法可以构建刮板。在我看来,您过多地专注于该元素,并希望精确选择。 另外,有必要掌握CSS选择器,尤其是CSS combbinators

欢呼