幻像-无法与page.evaluate一起使用循环

时间:2018-10-06 21:14:13

标签: javascript node.js web-scraping phantomjs

我正在使用String argument = this.getArguments().getString("category"); 抓取网页。这是初始设置:

public class ViewPagerAdapter extends FragmentPagerAdapter {
private final List<Fragment> fragList = new ArrayList<>();
private final List<String> titleList = new ArrayList<>();

public ViewPagerAdapter(FragmentManager fm) {
    super(fm);
}

@Override
public Fragment getItem(int position) {
  return  fragList.get(position);;
}
public void addFragment(Fragment fragment, String title) {
    fragList.add(fragment);
    titleList.add(title);
}

@Override
public CharSequence getPageTitle(int position) {
    return titleList.get(position);
}

@Override
public int getCount() {
    return fragList.size();
}

到目前为止,一切正常。能够成功确定phantom 6.0.3的长度为(async function () { const instance = await phantom.create(['--ignore-ssl-errors=yes', '--load-images=no', '--web-security=false'], {logLevel: 'error'}); const page = await instance.createPage(); await page.on('onResourceRequested', function (requestData) { console.info('Requesting', requestData.url); }); const url = // Some url const status = await page.open(url); const content = await page.evaluate(function () { return document.querySelector('ul > li'); }); const contentLength = content.length // 5 //Code Block 2 goes here })(); (有5个content项目)。因此,我现在要做的就是获取每个5元素中的li……这就是我要解决的问题。

我尝试使用innerText来检索每个li元素的for loop,但是它总是返回innerText。这是我尝试过的:

li

我不知道发生了什么。我可以指定要返回的特定索引,例如:null,这将为我提供正确的//Code Block 2: for (let i = 0; i < contentLength; i++) { const info = await page.evaluate(function () { const element = document.querySelector('ul > li'); return element[i].innerText; }); console.log(info); // this returns null 5 times } ,但是我无法通过return element[3].innerText

1 个答案:

答案 0 :(得分:3)

PhantomJS在不同的上下文中评估函数,因此它不知道参数i

您应将i传递给评估函数,以便将其转发到浏览器进程:

for (let i = 0; i < contentLength; i++) {
    const info = await page.evaluate(function (index) { // notice index argument
        const element = document.querySelector('ul > li');
        return element[index].innerText;
    }, i); // notice second argument is i

    console.log(info);
}