2017-08-19 7 views
-1

ここで私の在庫Webページからデータを抽出するには、beautifulsoup4を使用して助けが必要です。アイテムを1行ずつ取り出す方法

ウェブページは、アイテムの名前と、その特定の広告枠の詳細の複数の行を列挙した表が続く形式で書かれています。

私はアイテム名、実際の数量、有効期限を取得することに興味があります。

このようなHTML構造(添付文書を参照)を指定すると、どうやってやりますか?

  <div style="font-weight: bold">Item X</div> 
       <table cellspacing="0" cellpadding="0" class="table table-striped report-table" style="width: 800px"> 
        <thead> 
         <tr> 
          <th>&nbsp;</th> 
          <th>Supplier</th> 
          <th>Packing</th> 
          <th>Default Qty</th> 
          <th>Expensive</th> 
          <th>Reorder Point</th> 
          <th>Actual Qty</th> 
          <th>Expiry Date</th> 
         </tr> 
        </thead> 
        <tbody> 

          <tr> 
           <td>1</td> 
           <td>Company 1</td> 
           <td>3.8 L</td> 
           <td> 
            4 
           </td> 
           <td> 
            No 
           </td> 
           <td>2130.00</td> 
           <td>350.00</td> 
           <td>31-05-2019</td> 
          </tr> 

          <tr> 
           <td>2</td> 
           <td>Company 1</td> 
           <td>3.8 L</td> 
           <td> 
            4 
           </td> 
           <td> 
            No 
           </td> 
           <td>2130.00</td> 
           <td>15200.00</td> 
           <td>31-05-2019</td> 
          </tr> 

          <tr> 
           <td>3</td> 
           <td>Company 1</td> 
           <td>3.8 L</td> 
           <td> 
            4 
           </td> 
           <td> 
            No 
           </td> 
           <td>2130.00</td> 
           <td>210.00</td> 
           <td>31-05-2019</td> 
          </tr> 

         <tr> 
          <td colspan="5">&nbsp;</td> 
          <td>Total Qty&nbsp;15760.00</td> 
          <td>&nbsp;</td> 
         </tr> 
        </tbody> 
       </table> 



      <div style="font-weight: bold">Item Y</div> 
       <table cellspacing="0" cellpadding="0" class="table table-striped report-table" style="width: 800px"> 
        <thead> 
         <tr> 
          <th>&nbsp;</th> 
          <th>Supplier</th> 
          <th>Packing</th> 
          <th>Default Qty</th> 
          <th>Expensive</th> 
          <th>Reorder Point</th> 
          <th>Actual Qty</th> 
          <th>Expiry Date</th> 
         </tr> 
        </thead> 
        <tbody> 

          <tr> 
           <td>1</td> 
           <td>Company 2</td> 
           <td>50X10&#39;s</td> 
           <td> 
            10 
           </td> 
           <td> 
            Yes 
           </td> 
           <td>1090.00</td> 
           <td>271.00</td> 
           <td>31-01-2020</td> 
          </tr> 

          <tr> 
           <td>2</td> 
           <td>Company 2</td> 
           <td>50X10&#39;s</td> 
           <td> 
            10 
           </td> 
           <td> 
            Yes 
           </td> 
           <td>1090.00</td> 
           <td>500.00</td> 
           <td>31-01-2020</td> 
          </tr> 

          <tr> 
           <td>3</td> 
           <td>Company 2</td> 
           <td>50X10&#39;s</td> 
           <td> 
            10 
           </td> 
           <td> 
            Yes 
           </td> 
           <td>1090.00</td> 
           <td>69.00</td> 
           <td>31-01-2020</td> 
          </tr> 

          <tr> 
           <td>4</td> 
           <td>Company 2</td> 
           <td>50X10&#39;s</td> 
           <td> 
            10 
           </td> 
           <td> 
            Yes 
           </td> 
           <td>1090.00</td> 
           <td>475.00</td> 
           <td>01-01-2020</td> 
          </tr> 

         <tr> 
          <td colspan="5">&nbsp;</td> 
          <td>Total Qty&nbsp;1315.00</td> 
          <td>&nbsp;</td> 
         </tr> 
        </tbody> 
       </table> 
+0

OK、あなたはラインでページラインの任意の言葉を印刷したいですか? –

+0

私はfind_allとnext_siblingを使用しようとしましたが、うまく動作しませんでした。 – synesthesia

+0

これまでに試したことは? –

答えて

0

一つの解決策は、すなわち<tr>各行タグを反復した後だけ、各インデックス位置にある列セルはその方法を示し、アクセス列かを把握することです。これを行うには、BeautifulSoupのfind_allメソッドを使用します。このメソッドは、指定されたタグを持つすべての要素のリストを返します。

例:trタグは、実際にヘッダ行である場合には、次にtdタグ(のみthタグが存在するであろう)が存在しないことを

from bs4 import BeautifulSoup 
html_doc = YOUR HTML HERE 
soup = BeautifulSoup(html_doc, 'html.parser') 

for row in soup.find_all("tr"): 
    cells = row.find_all("td") 
    if len(cells) == 0: 
     #This is the header row 
    else: 
     #If you want to access the text of the Default Quantity column for example 
     default_qty = cells[3].text 

注、この場合のようにlen(cells)==0

0

これを行う方法の1つがここにあります。このアイデアは、属性の中での要素をboldという部分文字列で繰り返すことです。次に、ヘッダ名で、すべての項目についてfind_next_sibling()を使用して次のtableの兄弟を取得し、便利なアクセスのための辞書に行データを解析:

from bs4 import BeautifulSoup 


data = """your HTML here""" 

soup = BeautifulSoup(data, "lxml") 
for item in soup.select("div[style*=bold]"): 
    item_name = item.get_text() 
    table = item.find_next_sibling("table") 

    headers = [th.get_text(strip=True) for th in table('th')] 
    for row in table('tr')[1:-1]: 
     row_data = dict(zip(headers, [td.get_text(strip=True) for td in row('td')])) 

     print(item_name, row_data['Actual Qty'], row_data['Expiry Date']) 
    print("-----") 

プリント:

Item X 350.00 31-05-2019 
Item X 15200.00 31-05-2019 
Item X 210.00 31-05-2019 
----- 
Item Y 271.00 31-01-2020 
Item Y 500.00 31-01-2020 
Item Y 69.00 31-01-2020 
Item Y 475.00 01-01-2020 
----- 
+0

ご協力いただきありがとうございます。 iは、次のために上記のコードを試してみました出てきた: プリント(ITEM_NAME、row_data [ '実際の数量']、row_data [ '有効期限' 内: "\グラブの\ withoutlogin.py C"、19行、 ファイル]) KeyError: '実際の数量' – synesthesia

0

をすべてdivsを選択することができます次を見つけるために歩くtable

最後の行を除いてテーブルの行を調べると、特定のセルからテキストを抽出して在庫リストを作成できます。あなたがそうのように在庫を書くために、CSVライブラリを使用することができます

soup = BeautifulSoup(markup, "html5lib") 

inventory = [] 

for itemdiv in soup.select('div'): 
    table = itemdiv.find_next('table') 
    for supply_row in table.tbody.select('tr')[:-1]: 
     sn, supplier, _, actual_qty, _, _, _, exp = supply_row.select('td') 

     item = map(lambda node: node.text.strip(), [sn, supplier, actual_qty, exp]) 
     item[1:1] = [itemdiv.text] 
     inventory.append(item) 

print(inventory) 

import csv 

with open('some.csv', 'wb') as f: 
    writer = csv.writer(f, delimiter="|") 
    writer.writerow(('S/N', 'Item', 'Supplier', 'Actual Qty', 'Expiry Date')) 
    writer.writerows(inventory) 
関連する問題