2016-07-09 12 views
0

だから、私はボタンをクリックしたときに呼び出される関数を持っている、それはPythonでAJAXを読み込んだコンテンツを掻き集める?

var min_news_id = "68feb985-1d08-4f5d-8855-cb35ae6c3e93-1"; 
function loadMoreNews(){ 
    $("#load-more-btn").hide(); 
    $("#load-more-gif").show(); 
    $.post("/en/ajax/more_news",{'category':'','news_offset':min_news_id},function(data){ 
     data = JSON.parse(data); 
     min_news_id = data.min_news_id||min_news_id; 
     $(".card-stack").append(data.html); 
    }) 
    .fail(function(){alert("Error : unable to load more news");}) 
    .always(function(){$("#load-more-btn").show();$("#load-more-gif").hide();}); 
} 
jQuery.scrollDepth(); 

以下のようになり、今私はJavaScriptで多くの経験を持っていないが、私はそのを返すと仮定"en/ajax/more_news"のapiのいくつかのjsonデータです。

私はこのapiを直接呼び出すことができ、私のpythonスクリプトからjsonデータを取得できますか?はい、どうですか?

生成されているコンテンツをどのように削り取るのですか?あなたはhttps://www.inshorts.com/en/ajax/more_newsにスクリプトの内部を見るニュースIDを掲示する必要が

+0

APIからデータを取得するためには 'urllib2'を使い、JSONをPython辞書に解析するには' json.loads'を使います。 – Barmar

+0

@Barmar正確に何を送信する必要がありますか?このようなことを提案していますか? 'r = requests.post( 'http://inshorts.com/en/ajax/more_news'、json = {'category': ''、 'news_offset':min_news_id})' –

+1

ええ、それはかなりです。 JSONレスポンスを解析するには 'json.loads(r)'を使い、 'r ['html']'はレスポンスのHTMLを含みます。 – Barmar

答えて

0

、これはrequestsを使用した例です。

from bs4 import BeautifulSoup 
import requests 
import re 

# pattern to extract min_news_id 
patt = re.compile('var min_news_id\s+=\s+"(.*?)"') 

with requests.Session() as s: 
    soup = BeautifulSoup(s.get("https://www.inshorts.com/en/read").content) 
    new_id_scr = soup.find("script", text=re.compile("var\s+min_news_id")) 
    print(new_id_scr.text) 
    news_id = patt.search(new_id_scr.text).group() 
    js = s.post("https://www.inshorts.com/en/ajax/more_news", data={"news_offset":news_id}) 
    print(js.json()) 

JSはあなたにすべてのhtmlを与え、あなただけjs["html"]にアクセスする必要が。ここで

+0

空の結果を返しています O/P: '{'html': '\ n \ n'}' –

+0

'news_id = news_id.splitあなたのコードの 'news_id'には、 が表示されています。** var min_news_id = "vxy8k83f-1" ** それでニュースIDの値を抽出します。 これで正しく動作しています。 –

+0

@SalmanMohammad、 'patt.search(new_id_scr.text).group(1)' –

0

inshort.com

from bs4 import BeautifulSoup 
from newspaper import Article 
import requests 
import sys 
import re 
import json 

patt = re.compile('var min_news_id\s+=\s+"(.*?)"') 
i = 0 
while(1): 
    with requests.Session() as s: 
     if(i==0):soup = BeautifulSoup(s.get("https://www.inshorts.com/en/read").content,"lxml") 
    new_id_scr = soup.find("script", text=re.compile("var\s+min_news_id")) 
    news_id = patt.search(new_id_scr.text).group(1) 

    js = s.post("https://www.inshorts.com/en/ajax/more_news", data={"news_offset":news_id}) 
    jsn = json.dumps(js.json()) 
    jsonToPython = json.loads(jsn) 
    news_id = jsonToPython["min_news_id"] 
    data = jsonToPython["html"] 
    i += 1 
    soup = BeautifulSoup(data, "lxml") 
    for tag in soup.find_all("div", {"class":"news-card"}): 
     main_text = tag.find("div", {"itemprop":"articleBody"}) 
     summ_text = main_text.text 
     summ_text = summ_text.replace("\n", " ") 
     result = tag.find("a", {"class":"source"}) 
     art_url = result.get('href') 
     if 'www.youtube.com' in art_url: 
      print("Nothing") 
     else: 
      art_url = art_url[:-1] 
      #print("Hello", art_url) 
      article = Article(art_url) 
      article.download() 
      if article.is_downloaded: 
       article.parse() 
       article_text = article.text 
       article_text = article_text.replace("\n", " ") 

       print(article_text+"\n") 
       print(summ_text+"\n")   

にそれはinshort.comから要約し、それぞれのニュースから完全ニュースの両方を与えることをすべてのページを通じてます自動的にループスクリプトですチャンネル

関連する問題