2017-03-29 5 views
1

夕方、フィルター美しいスープ4つの所見を解析したページから

この問題を解決する方法を見つけようとしているうちに、私は行き詰まってしまった。

私はBS4のfindAll()関数を使用してタグ付き製品ページを解析しています。正しい応答が得られますが、私が探している領域はBS4を使ってフィルタリングできるタグなしの "プレーンテキスト"私は理解している

def find_product(counter): 
url = base_url 
print('Looking in ' + url) 
while not matches[counter]: 
    print(datetime.datetime.fromtimestamp(time.time()).strftime('%Y-%m-%d %H:%M:%S')) 
    try: 
     response1 = search_session.get(url) 
    except: 
     print('Unable to connect to site...') 
     if counter == checkout_qty - 1: 
      sys.exit() 
     else: 
      continue 

    soup1 = bs(response1.text, 'html.parser') 
    #soup1.find_all('script') 
    soup2 = soup1.findAll('script', text = re.compile('id    : ')) #using text recompiling doesn't really do anything,just gives a slightly cleaner output of findings. 
    print(soup2) 
    for ids in soup2: 
     link = ids.find(text = re.compile('id')) 
     #i think i should use it somehow here,but I lack knowledge 
     #this loop is unfinished 


    break 

これは私が製品ページから解析しているものです。

<main class="B__container"> 
     <script> 

    product.p = { 
    id    : 47755536459, 
    title   : "PRODUCT NAME", 
    handle   : "PRODUCT HANDLE", 
    vendor   : "", 
    available  : , 
    images   : ["image-link.com\/files\/1111"], 
    featured_image : "image-link.com\/files\/1111", 
    options  : ["Size"], 
    tags   : [], 
    price   : 24000, 
    variants  : [] 
    }; 

    product.p.variants.push({ 
     id    : 40113207495, 
     parent_id   : 10025946759, 
     available   : false, 
     featured_image : null, 
     public_title  : null, 
     requires_shipping : true, 
     price    : 24000, 
     options   : ["4"], 
     option1   : "4", 
     option2   : "", 
     option3   : "", 
     option4   : "" 
    }); 

    product.p.variants.push({ 
     id    : 40113207559, 
     parent_id   : 10025946759, 
     available   : false, 
     featured_image : null, 
     public_title  : null, 
     requires_shipping : true, 
     price    : 24000, 
     options   : ["4.5"], 
     option1   : "4.5", 
     option2   : "", 
     option3   : "", 
     option4   : "" 
    }); 

    product.p.variants.push({ 
     id    : 40113207623, 
     parent_id   : 10025946759, 
     available   : false, 
     featured_image : null, 
     public_title  : null, 
     requires_shipping : true, 
     price    : 24000, 
     options   : ["5"], 
     option1   : "5", 
     option2   : "", 
     option3   : "", 
     option4   : "" 
    }); 
    </script> 

私の目標は、数字でIDを抽出し、後でそれを別の機能に送信することです。

問題がある、知識が不足している、または私が望むものを得るためにBS4をどのように使用するかのスキルが欠けています。

+0

あなたはURLを投稿できますか?あなたは2つの可能な解決方法があります:1)ウェブサイトから直接情報を入手しようとするか、2)このテキストブロックを処理して、あなたが望むものを得る... –

+0

「変種」のこれらの配列は、タスクのために。私は 'id'を集める必要があります。具体的には、数字 'id'が割り当てられていて、それをカートに追加するために使用します。必要なデータをフィルタリングするために、これらの配列/ブロックをコールドプロセスでどのように処理するかに関するガイドラインを教えてください。 – zekron

+0

"これは私が製品ページから解析しているもの"の後に続くテキストブロックです。 'soup2'ですか? –

答えて

0

このコードを試してみてください。これは必要な情報を取得するための文字列操作です。この場合はidの値です。 \n

  • for

    1. 分割データリスト内の各要素、True場合ストリングid
    2. であるかどうかを確認し、いくつかの操作(stripsplitreplace
    後行を印刷します

    コード:

    s = soup2.text 
    data = s.split('\n') 
    
    for i, d in enumerate(data): 
        if " id " in d: 
         print(data[i].strip().split(':')[1].replace(',', '')) 
    

    出力:

    47755536459 
    40113207495 
    40113207559 
    40113207623 
    

    編集コード:

    for ids in soup2: 
        s = ids.text 
        data = s.split('\n') 
    
        for i, d in enumerate(data): 
         if " id " in d: 
          print(data[i].strip().split(':')[1].replace(',', '')) 
    

    代わりのprint、あなたはlistに各IDをappendし、後でそれらを使用することができます。

  • +0

    何らかの理由で、 's'に関連したエラーが発生しています。 "s = soup2.text AttributeError: 'ResultSet'オブジェクトに 'text'属性がありません"これはコードを実装した方法です: 'soup1 = bs(response1。テキスト、 'html.parser') #soup1.find_all( 'script') soup2 = soup1.findAll( 'script') print(soup2)#テスト目的 s = soup2。(データ): data = s.split( '\ n') i、d列挙型(データ): d: の "id"の場合print(data [i] .strip()。split( ':'私は、コメントの書式を正しく設定する方法がわからないことを教えてください。 – zekron

    +0

    'find_all'メソッドは' ResultSet'オブジェクトを返します。これは 'for() 'ループ。ですから 'for'ループを使って見つかった' script'をループし、 '.text'を使って変換するか、' find_all'の代わりに 'find'を使って最初のスクリプト要素だけを取得するべきです。 Btw、私はあなたが 'soup2のIDのために:s = ids.text'などを使用するとうまくいくと思います... –

    +0

    はい、最後の提案は完璧に機能しました! – zekron

    関連する問題