【问题标题】:PuppeteerSharp - querySelectorAll + clickPuppeteerSharp - querySelectorAll + 点击
【发布时间】:2021-04-05 00:18:35
【问题描述】:

我是 puppeteersharp 的新手。你能告诉我,在我的思考过程和代码中,我哪里出错了。我正在尝试获取对该产品的评论:

https://www.newegg.com/gigabyte-geforce-rtx-2060-gv-n2060oc-6gd/p/N82E16814932115

当您点击检索自的评论标签时,所有评论都会加载

document.querySelectorAll(".tab-nav")[4]

reviews 在这段代码之后为空:

            using (var browser = await Puppeteer.LaunchAsync(options))
            {
                using (var page = await browser.NewPageAsync().ConfigureAwait(false))
                {
                    await page.GoToAsync("https://www.newegg.com/gigabyte-geforce-rtx-2060-gv-n2060oc-6gd/p/N82E16814932115");

                    var clickReviews = "document.querySelectorAll('.tab-nav')[4].click();";
                    var reviews = "Array.from(document.querySelectorAll('.comments-content'));";

                    await page.EvaluateExpressionAsync(clickReviews);
                    var reviews = await page.EvaluateExpressionAsync(reviews);
                    Console.WriteLine(reviews);

【问题讨论】:

    标签: c# web-scraping web-crawler puppeteer-sharp


    【解决方案1】:

    EvaluateExpressionAsync 不会返回 DOM 元素。您应该构建一个序列化的输出。例如,带有评论文本的string[]

    var reviews = "Array.from(document.querySelectorAll('.comments-content')).map(r => r.innerText);";
    var reviews = await page.EvaluateExpressionAsync<string[]>(reviews);
    Console.WriteLine(reviews);
    

    【讨论】:

    • 谢谢。我现在遇到另一个问题。你知道为什么评论仍然为空吗?但是,当我在调试器中运行它时,它会返回正确的结果?
    • 好的,我想通了。不过,我还是有点失落。在不呈现 javascript 的情况下,“cmets-content”类(显示每条评论的类)会加载 8 条评论。因此,我需要单击加载剩余 17 条评论的评论选项卡。我通过等待“cmets-content”再次加载来解决我的问题。但是,这是为什么呢? cmets-content在点击之前不是已经存在了吗?为什么我必须等待它?
    猜你喜欢
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 2015-10-12
    • 1970-01-01
    • 2014-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多