我正在尝试取消维基百科页面以获取航空公司列表,首先报废第一页,然后转到航空公司的每个单独页面以获取网站网址。我已将代码分为两个函数。一个是废弃主页面并获取一个新网址,另一个是从创建的网址中删除另一个页面以从该页面获取网站名称。我使用了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]值而不是String。我该如何解决这个问题?
答案 0 :(得分:1)
异步函数返回promise。如果是这样,您需要使用then来获得已解析的响应或使用await。 如果代码的其他部分没问题,这应该可以。
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(async (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 = await getAirlineUrl(wiki_url);
console.log(`airline_url = ${airline_url}`);
}
});
}
答案 1 :(得分:0)
由于您的getAirlineUrl
函数返回了一个承诺,您需要await
承诺。您不能将await
嵌套在.each
回调中,因为回调不是异步函数,如果是,它将无法正常工作。最好的解决方法是避免使用.each
并使用循环。
export async function getAirlinesWebsites(req,res) {
let response = await request(options_mainpage);
console.log(`Data`);
let $ = cheerio.load(response);
console.log('Response got');
for (const [i, e] of Array.from($('tr')).entries()) {
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 = await getAirlineUrl(wiki_url);
console.log(`airline_url = ${airline_url}`);
}
}
}