2017-01-23 27 views
1

私はPython +美しいスープでクローラを作成しています。Pythonを使用してスクリプトで値を取得する方法

dataLayerでデータを取得するには、タグにアクセスする必要があります。

私はbeatifulsoupで検索し、必要なタグを返すことができましたが、情報にアクセスするためにjsonに変換することはできません。

これは私が取得するために作られたコードです:

page = get_html('URL') 
    dataLayer = page.findAll('script')[NUMBER OF SCRIPT] 

そして、これは私のリターンです:

<script type="text/javascript"> 
    dataLayer = [{ 

     'site': { 
      'isMobile': false 
     }, 
     'page': { 
      'pageType': 'ad_detail', 
      'detail': { 
       'parent_category_id': '2000', 
       'category_id': '2020', 
       'state_id': '2', 
       'region_id': '31', 

        'ad_id': '293231982', 
        'list_id': '250941507', 
        'city_id': '9208', 
        'zipcode':'34710620', 

      }, 

       'adDetail': { 
        'adID': '293231982', 
        'listID': '250941507', 
        'sellerName': 'Marr', 
        'adDate': '2016-11-30 20:52:11', 
       }, 

     }, 
     'session': { 
      'user': { 
       'userID': '', 
       'loginType': '' 
      } 
     }, 

     'pageType': 'Ad_detail', 
     'abtestingEnable' : '1', 



     // Listing information 

     'listingCategory': '2020', 


     // Ad information 
     'adId': '293231982', 
     'state': '2', 
     'region': '31', 
     'category': '2020', 

     'pictures': '8', 
     'listId': '250941507', 

     //Account Information 

     'loggedUser':'0', 

     'referrer': '', 

     //User Information 


    }]; 
</script> 

私はadDateや郵便番号などのデータを取得したいと思います。

+0

( " '郵便番号': '(\ D +')"、dataLayer).group(1)あなたは、辞書でそれを読み込むことができます ' –

+0

jsonモジュールを使用して、それらの値に容易にアクセスできますキーを押す。 [here](https://docs.python.org/3/library/json.html)を参照してください。 'json.loads( '')' – TryToSolveItSimple

答えて

2
s = soup.script.text.replace('\'', '"') # replace ' with " 
s = re.search(r'\{.+\}', s, re.DOTALL).group() # get json data 
s = re.sub(r'//.+\n', '', s) # replace comment 
s = re.sub(r'\s+', '', s) # strip whitspace 
s = re.sub(r',}', '}', s) # get rid of last , in the dict 
json.loads(s) 

アウト:

あなたは `regex`、例えば` re.searchを試すことができます
{'abtestingEnable': '1', 
'adId': '293231982', 
'category': '2020', 
'listId': '250941507', 
'listingCategory': '2020', 
'loggedUser': '0', 
'page': {'adDetail': {'adDate': '2016-11-3020:52:11', 
    'adID': '293231982', 
    'listID': '250941507', 
    'sellerName': 'Marr'}, 
    'detail': {'ad_id': '293231982', 
    'category_id': '2020', 
    'city_id': '9208', 
    'list_id': '250941507', 
    'parent_category_id': '2000', 
    'region_id': '31', 
    'state_id': '2', 
    'zipcode': '34710620'}, 
    'pageType': 'ad_detail'}, 
'pageType': 'Ad_detail', 
'pictures': '8', 
'referrer': '', 
'region': '31', 
'session': {'user': {'loginType': '', 'userID': ''}}, 
'site': {'isMobile': False}, 
'state': '2'} 
1

お客様のjsonでは、二重引用符の代わりに一重引用符が使用されています。 すべての一重引用符を二重引用符に置き換えて、dataLayer変数jsonに準拠させる必要があります。

シンプル.replace( "'"、 '"')トリックを行う必要があります

注:。。あなたは、第二の正規表現でコメント行を削除する必要が

関連する問題