【发布时间】:2017-07-26 15:33:25
【问题描述】:
我正在尝试通过首先废弃第一页然后转到航空公司的每个单独页面以获取网站 url 来废弃 wikipedia 页面以获取航空公司列表。我将代码分为两个功能。一个是废弃主页并获取一个新的 url,第二个函数是从创建的 url 废弃另一个页面以从该页面获取网站名称。我已经使用 request-promise 模块来获取 html,然后使用 Cheerio 来解析数据。
export async function getAirlinesWebsites(req,res) {
let response = await request(options_mainpage);
console.log(`Data`);
let $ = cheerio.load(response);
console.log('Response got');
$('tr').each((i,e)=>{
let children = '';
console.log('inside function ', i);
if($(e).children('td').children('a').attr('class') !== 'new') {
children = $(e).children('td').children('a').attr('href');
let wiki_url = 'https://en.wikipedia.org' + children;
console.log(`wiki_url = ${wiki_url}`);
let airline_url = getAirlineUrl(wiki_url);
console.log(`airline_url = ${airline_url}`);
}
})
然后 getAirlineUrl() 函数将根据提供的 url 解析另一个页面。
async function getAirlineUrl(url){
const wiki_child_options = {
url : url,
headers : headers
}
let child_response = await request(wiki_child_options);
let $ = cheerio.load(child_response);
let answer = $('.infobox.vcard').children('tbody').children('tr').children('td').children('span.url').text();
return answer;
})
但是,当我在父函数中控制台记录 answer 变量时,我得到一个 [object Promise] 值而不是字符串。我该如何解决这个问题?
【问题讨论】:
-
airline_url 返回对象承诺?
-
是的,当我控制台记录它时,它会给出 [object Promise]。
-
我的猜测是您正在尝试在代码中的其他位置使用请求设置
span.url的内容,但是请求是异步的,并且这个请求返回了一个承诺,所以无论您身在何处设置span.url的文本,在成功的promise 回调中进行,不要将它设置为promise 的值。 MDN Promise,通过设置看起来像$(..).text(someReq()); function someReq() { ... return promise; }的承诺来扩展我的意思@ -
@PatrickBarr span.url 只是一个包含 url 的文本,该文本被传递给另一个函数以解析该页面。
标签: javascript node.js ecmascript-6 cheerio request-promise