- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试进行网络抓取,并且我得到了一个看起来很容易抓取的网站。然而,这个网站有很多具有相同ID的元素,这使得选择器的使用变得困难。
因此,我尝试使用完整的 XPath 来获取元素。问题是,当我在网站上打开 Chrome 控制台并输入:
$x("/html/body/div[2]/div[4]/div/table[2]/tbody/tr/td[1]/div[1]/div[1]/table/tbody/tr[1]/td/table/tbody/tr[2]/td[2]")
有时有效,有时无效。我注意到它在检查元素后尤其有效。我在其他线程上发现它可能与 iframe 有关,但是 chrome 控制台的 iframe 选择在工作或不工作时似乎没有改变。
使用 Puppeteer,此表达式始终返回空元素。这是我的代码的摘录:
const puppeteer = require('puppeteer');
const URL = "https://www.soccerstats.com/results.asp?league=england_2019&pmtype=bygameweek";
let browser = await puppeteer.launch(properties);
let page = await browser.newPage();
await page.goto(URL, {timeout: 60000, waitUntil: 'domcontentloaded'}).then(() => {
console.log('success')
});
let match_xpath = "/html/body/div[2]/div[4]/div/table[2]/tbody/tr/td[1]/div[1]/div[1]/table/tbody/tr[1]/td/table/tbody/tr[2]/td[2]";
await page.waitForXPath(match_xpath);
let match = (await page.$x(match_xpath))[0];
let info = await page.evaluate((el) => {
return el.innerHTML
}, match);
console.log(info) //This always returns 'undefined'
为什么会这样?如何获取元素的实际内容?
提前致谢!
最佳答案
我认为您的 puppeteer 脚本中的代码不会等待元素显示在浏览器(DOM)中。因此,您可以设置 waitUntil: 'networkidle0'
来等待 XHR (AJAX) 请求完成并显示在浏览器中。
下面的代码仅抓取第一个表
const puppeteer = require('puppeteer')
const URL = 'https://www.soccerstats.com/results.asp?league=england_2019&pmtype=bygameweek'
;(async () => {
const browser = await puppeteer.launch({
headless : true,
devtools : false
})
const [page] = await browser.pages()
page.setDefaultNavigationTimeout(0)
page.setRequestInterception(true)
page.on('request', request => {
if ( request.resourceType() === 'image' ) {
request.abort()
} else {
request.continue()
}
})
await page.goto(URL, {timeout: 0, waitUntil: 'networkidle0'})
const teams = await page.evaluate( () => {
const teams = []
document.querySelectorAll('.tabbertab:not(.tabbertabhide):not(.tabbertabdefault) #btable > tbody > tr:not(.even) > td:not([align])').forEach(item => teams.push(item.innerText.trim()) )
return teams
})
console.log (teams)
await browser.close ()
})()
如果您想获取每个#btable
中的所有团队,您可以使用此代码。
PS:我没有使用xPath,因为它不好用,而且容易出错。
const puppeteer = require('puppeteer')
const URL = 'https://www.soccerstats.com/results.asp?league=england_2019&pmtype=bygameweek'
;(async () => {
const browser = await puppeteer.launch({
headless : true,
devtools : false
})
const [page] = await browser.pages()
page.setDefaultNavigationTimeout(0)
page.setRequestInterception(true)
page.on('request', request => {
if ( request.resourceType() === 'image' ) {
request.abort()
} else {
request.continue()
}
})
await page.goto(URL, {timeout: 0, waitUntil: 'networkidle0'})
const allRoundTeams = await page.evaluate( () => {
var allRoundTeams = []
document.querySelectorAll('#btable').forEach(item => {
if (item.querySelector('tbody > tr > td > b') !== null) {
var title = item.querySelector('tbody > tr > td > b').innerText.trim().replace(/(\r\n|\n|\r)/gm,"");
var teams = []
item.querySelectorAll('tbody > tr:not(.even) > td:not([align])').forEach(team => {
teams.push(team.innerText.trim())
})
allRoundTeams.push({
title : title,
teams : teams
})
}
})
return allRoundTeams
})
allRoundTeams.forEach(round => {
console.log(round.title)
console.log('========')
round.teams.forEach(team => {
console.log (team)
})
console.log('\n')
})
await browser.close ()
})()
关于javascript - Puppeteer 找不到 Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59439812/
例如,我有一个父类Author: class Author { String name static hasMany = [ fiction: Book,
代码如下: dojo.query(subNav.navClass).forEach(function(node, index, arr){ if(dojo.style(node, 'd
我有一个带有 Id 和姓名的学生表和一个带有 Id 和 friend Id 的 Friends 表。我想加入这两个表并找到学生的 friend 。 例如,Ashley 的 friend 是 Saman
我通过互联网浏览,但仍未找到问题的答案。应该很容易: class Parent { String name Child child } 当我有一个 child 对象时,如何获得它的 paren
我正在尝试创建一个以 Firebase 作为我的后端的社交应用。现在我正面临如何(在哪里?)找到 friend 功能的问题。 我有每个用户的邮件地址。 我可以访问用户的电话也预订。 在传统的后端中,我
我主要想澄清以下几点: 1。有人告诉我,在 iOS 5 及以下版本中,如果您使用 Game Center 设置多人游戏,则“查找 Facebook 好友”(如与好友争夺战)的功能不是内置的,因此您需要
关于redis docker镜像ENTRYPOINT脚本 docker-entrypoint.sh : #!/bin/sh set -e # first arg is `-f` or `--some-
我是一名优秀的程序员,十分优秀!