私は、最初にページを破棄して航空会社の各ページに移動して、WebサイトのURLを取得することで、航空会社のリストを取得するためにwikipediaページをスクラップしようとしています。私は2つの関数でコードを分割しました。 1つはメインページをスクラップして新しいURLを取得し、2つ目の機能は作成したURLから別のページをスクラップしてそのページからウェブサイト名を取得することです。私はhtmlを取得してcheerioを取得してデータを解析するためのrequest-promiseモジュールを使用しました。promise関数から適切なデータを受け取ることができません
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;
})
ただし、親関数に応答変数を記録すると、Stringの代わりに[オブジェクトのPromise]値が得られます。この問題を解決するにはどうすればよいですか?
airline_urlはオブジェクトの約束を返しますか? – error404
はいコンソールにログオンすると[オブジェクトの約束]が表示されます。 –
私の推測では、 'span.url'の内容をコード内の別の場所に設定しようとしていますが、リクエストは非同期で、これは約束を返しています。 url'のテキスト、成功した約束のコールバックでそれを行い、約束の値に設定しないでください。 [MDN Promise](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise)、私が約束するように設定することで、$(.. ).text(someReq());関数someReq(){...約束を返す; } ' –