我试图从 this NCBI.gov page中删除html.我需要包含#see-all URL片段,这样我才能保证获得搜索页而不是从错误的基因页面 https://www.ncbi.nlm.nih.gov/gene/119016中检索HTML. URL片段不会传递到服务器,而是
URL片段不会传递到服务器,而是由页面客户端的javascript使用(在本例中)创建完全不同的HTML,这是您在浏览器中转到页面时获得的“查看”页面源“,这是我想要检索的HTML. R readLines() ignores url tags followed by #
我首先尝试使用phantomJS,但它刚刚返回了ReferenceError: Can’t find variable: Map中描述的错误,而且似乎是由于phantomJS不支持NCBI正在使用的某些功能,因此消除了这种解决方案.
我使用以下使用node.js评估的Javascript在Puppeteer上取得了更多成功:
const puppeteer = require('puppeteer'); (async() => { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto( 'https://www.ncbi.nlm.nih.gov/gene/?term=AGAP8#see-all'); var HTML = await page.content() const fs = require('fs'); var ws = fs.createWriteStream( 'TempInterfaceWithChrome.js' ); ws.write(HTML); ws.end(); var ws2 = fs.createWriteStream( 'finishedFlag' ); ws2.end(); browser.close(); })();
然而,这返回了似乎是预渲染的html.我如何(以编程方式)获取我在浏览器中获得的最终html?
你可以尝试改变这个:await page.goto( 'https://www.ncbi.nlm.nih.gov/gene/?term=AGAP8#see-all');
进入这个:
await page.goto( 'https://www.ncbi.nlm.nih.gov/gene/?term=AGAP8#see-all', {waitUntil: 'networkidle'});
或者,您可以创建一个函数listenFor()来侦听页面加载时的自定义事件:
function listenFor(type) { return page.evaluateOnNewDocument(type => { document.addEventListener(type, e => { window.onCustomEvent({type, detail: e.detail}); }); }, type); }` await listenFor('custom-event-ready'); // Listen for "custom-event-ready" custom event on page load.
LE:
这也可能派上用场:
await page.waitForSelector('h3'); // replace h3 with your selector