Javascript 木偶演员获得行数
由于某种原因,我一直得到一个Javascript 木偶演员获得行数,javascript,html,web-scraping,puppeteer,Javascript,Html,Web Scraping,Puppeteer,由于某种原因,我一直得到一个null,作为返回,我试图获取一些包含这些类名列表的行。如何使用这个类链列表获取行列表 我的代码 const alternativeRowsCounts = await page.$$eval( '.ExResult-row > .ExResult-row--relatedExercises > .flexo-container > .flexo-between', element =
null
,作为返回,我试图获取一些包含这些类名列表的行。如何使用这个类链列表获取行列表
我的代码
const alternativeRowsCounts = await page.$$eval(
'.ExResult-row > .ExResult-row--relatedExercises > .flexo-container > .flexo-between',
element => element.innerText //i've also tried rows instead of elements but still got null
// (rows) => rows.length
);
console.log(`Number of rows = ${alternativeRowsCounts}`)
DOM的较大部分
我正在尝试对h3
标记中的ExResult resultsHeading
进行挖掘。例如:Barbell台式压力机-中等握力
<section class="ExDetail-section ExDetail-related">
<h3 class="ExHeading ExHeading--h3">
Alternative Exercises for Dumbbell Bench Press
</h3>
<div class="ExResult-row ExResult-row--relatedExercises flexo-container flexo-between" itemscope="" itemtype="http://schema.org/ExerciseAction">
<div class="ExResult-cell ExResult-cell--imgs ">
<!-- using male photos -->
<img class="ExImg ExResult-img ls-is-cached lazyloaded" width="70" height="70" onerror="if (window._E_) _E_(this)" alt="Barbell Bench Press - Medium Grip thumbnail image" src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-81e-bench-press-m1-square-600x600.jpg" data-src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-81e-bench-press-m1-square-600x600.jpg" itemprop="image">
<!-- using male photos -->
<img class="ExImg ExResult-img ls-is-cached lazyloaded" width="70" height="70" onerror="if (window._E_) _E_(this)" alt="Barbell Bench Press - Medium Grip thumbnail image" src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-81e-bench-press-m2-square-600x600.jpg" data-src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-81e-bench-press-m2-square-600x600.jpg" itemprop="image">
</div>
<div class="ExResult-cell ExResult-cell--nameEtc">
<h3 class="ExHeading ExResult-resultsHeading">
<a href="/exercises/barbell-bench-press-medium-grip" itemprop="name">
Barbell Bench Press - Medium Grip
</a>
</h3>
<div class="ExResult-details ExResult-muscleTargeted">
Muscle Targeted:
<a href="/exercises/muscle/chest">
Chest
</a>
</div>
<div class="ExResult-details ExResult-equipmentType">
Equipment Type:
<a href="/exercises/equipment/barbell">
Barbell
</a>
</div>
</div>
<div class="ExResult-cell ExResult-cell--rating">
<div class="ExRating">
<div class="ExRating-badge">
9
</div>
<div class="ExRating-description ExRating-description--Average">
Average
</div>
</div>
</div>
</div> <div class="ExResult-row ExResult-row--relatedExercises flexo-container flexo-between" itemscope="" itemtype="http://schema.org/ExerciseAction">
<div class="ExResult-cell ExResult-cell--imgs ">
<!-- using male photos -->
<img class="ExImg ExResult-img ls-is-cached lazyloaded" width="70" height="70" onerror="if (window._E_) _E_(this)" alt="Incline dumbbell bench press thumbnail image" src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-3n-incline-dumbbell-bench-press-m1-square-600x600.jpg" data-src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-3n-incline-dumbbell-bench-press-m1-square-600x600.jpg" itemprop="image">
<!-- using male photos -->
<img class="ExImg ExResult-img ls-is-cached lazyloaded" width="70" height="70" onerror="if (window._E_) _E_(this)" alt="Incline dumbbell bench press thumbnail image" src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-3n-incline-dumbbell-bench-press-m2-square-600x600.jpg" data-src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-3n-incline-dumbbell-bench-press-m2-square-600x600.jpg" itemprop="image">
</div>
<div class="ExResult-cell ExResult-cell--nameEtc">
<h3 class="ExHeading ExResult-resultsHeading">
<a href="/exercises/incline-dumbbell-press" itemprop="name">
Incline dumbbell bench press
</a>
</h3>
<div class="ExResult-details ExResult-muscleTargeted">
Muscle Targeted:
<a href="/exercises/muscle/chest">
Chest
</a>
</div>
<div class="ExResult-details ExResult-equipmentType">
Equipment Type:
<a href="/exercises/equipment/dumbbell">
Dumbbell
</a>
</div>
</div>
<div class="ExResult-cell ExResult-cell--rating">
<div class="ExRating">
<div class="ExRating-badge">
9.1
</div>
<div class="ExRating-description ExRating-description--Average">
Average
</div>
</div>
</div>
</div> <div class="ExResult-row ExResult-row--relatedExercises flexo-container flexo-between" itemscope="" itemtype="http://schema.org/ExerciseAction">
<div class="ExResult-cell ExResult-cell--imgs ">
<!-- using male photos -->
<img class="ExImg ExResult-img ls-is-cached lazyloaded" width="70" height="70" onerror="if (window._E_) _E_(this)" alt="Kettlebell alternating floor press thumbnail image" src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-6k-kettlebell-alternating-floor-press-m1-square-600x600.jpg" data-src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-6k-kettlebell-alternating-floor-press-m1-square-600x600.jpg" itemprop="image">
<!-- using male photos -->
<img class="ExImg ExResult-img ls-is-cached lazyloaded" width="70" height="70" onerror="if (window._E_) _E_(this)" alt="Kettlebell alternating floor press thumbnail image" src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-6k-kettlebell-alternating-floor-press-m2-square-600x600.jpg" data-src="https://www.bodybuilding.com/images/2020/xdb/cropped/xdb-6k-kettlebell-alternating-floor-press-m2-square-600x600.jpg" itemprop="image">
</div>
<div class="ExResult-cell ExResult-cell--nameEtc">
<h3 class="ExHeading ExResult-resultsHeading">
<a href="/exercises/alternating-floor-press" itemprop="name">
Kettlebell alternating floor press
</a>
</h3>
<div class="ExResult-details ExResult-muscleTargeted">
Muscle Targeted:
<a href="/exercises/muscle/chest">
Chest
</a>
</div>
<div class="ExResult-details ExResult-equipmentType">
Equipment Type:
<a href="/exercises/equipment/kettlebells">
Kettlebells
</a>
</div>
</div>
<div class="ExResult-cell ExResult-cell--rating">
<div class="ExRating">
<div class="ExRating-badge">
6
</div>
<div class="ExRating-description ExRating-description--Average">
Average
</div>
</div>
</div>
</div> </section>
您需要使用
length
属性,而不是innerText
属性:
const alternativeRowsCounts=等待页面。$$eval(
'.ExResult行>.ExResult行--relatedExercises>.flexo container>.flexo-between',
elements=>elements.length
);
log(`Number of rows=${alternativeRowsCounts}`);
你可以参考
我不确定选择器是否正确,它也可能是错误的,但我无法判断,因为我没有从DOM中看到更多信息。但你可以试试这个:
const alternativeRowsCounts=等待页面。$$eval(
“柔印中间部分”,
elements=>elements.length
);
log(`Number of rows=${alternativeRowsCounts}`);
获取元素的直接子元素。您需要使用
length
属性,而不是innerText
属性:
const alternativeRowsCounts=等待页面。$$eval(
'.ExResult行>.ExResult行--relatedExercises>.flexo container>.flexo-between',
elements=>elements.length
);
log(`Number of rows=${alternativeRowsCounts}`);
你可以参考
我不确定选择器是否正确,它也可能是错误的,但我无法判断,因为我没有从DOM中看到更多信息。但你可以试试这个:
const alternativeRowsCounts=等待页面。$$eval(
“柔印中间部分”,
elements=>elements.length
);
log(`Number of rows=${alternativeRowsCounts}`);
获取元素的直接子元素。感谢您抽出时间提供帮助。对于这两个代码,它仍然给了我0。我在我的问题中发布了DOM的大部分内容。它不是在iframe中吗?影子DOM?页面加载正确吗?没有。页面已完全加载。我可以得到一个标题,但我不能得到所有的标题,因为每个页面都有1到3个标题。但是它们都有相同的
html元素
和类
const alternativeExerciseNames=wait page.$$('h3.ExResult-resultsHeading>a',(el)=>el.innerText)
@BruceMathers:您编辑的2个代码是错误的,请阅读木偶师文档如果您需要获取多个内部文本,您可以使用页面。$$eval()
和一个包含map()
函数的回调函数。同样,它在文档中,只需阅读示例并使其适应您的问题。感谢您抽出时间提供帮助。对于这两个代码,它仍然给了我0。我在我的问题中发布了DOM的大部分内容。它不是在iframe中吗?影子DOM?页面加载正确吗?没有。页面已完全加载。我可以得到一个标题,但我不能得到所有的标题,因为每个页面都有1到3个标题。但是它们都有相同的html元素
和类
const alternativeExerciseNames=wait page.$$('h3.ExResult-resultsHeading>a',(el)=>el.innerText)
@BruceMathers:您编辑的2个代码是错误的,请阅读木偶师文档如果您需要获取多个内部文本,您可以使用页面。$$eval()
和一个包含map()
函数的回调函数。同样,它在文档中,只需阅读示例并根据您的问题进行调整。
const alternativeExerciseNames = await page.$$(
'h3.ExResult-resultsHeading > a',
(el) => el.innerText
);