2017-07-31 9 views
1

私はPythonで新しいことを言って始めます。私は最近、スラックボットに取り組んできました。ここに私がこれまで行ってきたことがあります。BS4でfindAllを使用してリストを作成する

source = requests.get(url).content 
soup = BeautifulSoup(source, 'html.parser') 
price = soup.findAll("a", {"class":"pricing"})["quantity"] 

ここでは、私が掻き取ろうとしているHTMLコードを示します。

<a class="pricing" saleprice="240.00" quantity="1" added="2017-01-01"> S </a> 
<a class="pricing" saleprice="21.00" quantity="5" added="2017-03-14"> M </a> 
<a class="pricing" saleprice="139.00" quantity="19" added="2017-06-21"> L </a> 

私はsoup.find()を使用し、私は最初の量の値を見つけることができるが、私は、リスト内でそれらのすべてを必要とします。私はbs4の代わりにlxmlのような別のライブラリを使ってみましたが、どちらにも不運はありませんでした。私はすでにこれに長い時間を費やしてきたので、どんな助けも本当に感謝しています。

+0

。私は '.find_all'を動かすことをお勧めします。 –

答えて

2

findAllメソッドは、bs4 Tag要素のリストを返します。したがって、属性を直接選択することはできません。ただし、単純なリストの理解で、その反復可能な項目の属性を選択できます。それはNoneを返します(またはデフォルト値を設定することができます)キーがattrs辞書に存在しない場合ので、それが属性にアクセスするときgetを使用するのが最善だと

price = [a.get("quantity") for a in soup.findAll("a", {"class":"pricing"})] 

注意。

Jon Clementsさんから指摘されているように、「数量」属性を持たないアイテムがある場合は、リストにNoneアイテムを追加したくない場合は、「クラス」と「数量」でフィルタリングできます。ただ、 `.findAll`は後方互換性のためだけに実際にあると私はより多くのPython-yの命名規則のleuiに廃止されて信じていることに注意することが

price = [a["quantity"] for a in soup.find_all("a", {"class":"pricing", "quantity":True})] 
+0

'soup.select( 'a.pricing')'が読みやすくなるかもしれません...デフォルト値の代わりに、非価格の要素を除外することもできます。例えば、 '[a ['quantity'] in a soup .find_all( "a"、class _ = 'pricing'、quantity = True)] ' –

+0

真ですが、私は' get'メソッドを好む、それは簡単です。あなたは 'select'と' find_all'についてまったく正しいです。 –

+0

デフォルト値と一貫した結果の長さが必要な場合は、 '.get'が意味を持ちます。空の値を必要としない場合は、フィルタリングが意味を持ちます。ユースケースに応じて、後のオプションを指摘していました。 –

関連する問題