【问题标题】:Beautiful Soup Table to CSV漂亮的汤表到 CSV
【发布时间】:2020-01-20 22:38:20
【问题描述】:

我正在使用漂亮的汤来尝试抓取网站表并仅将特定列提取到 CSV 文件中。

import requests
import urllib.request
from bs4 import BeautifulSoup

product_table = browser.page_source

soup = BeautifulSoup(product_table, 'html.parser')

table = soup.find_all('table')[4]

table_rows = table.find_all('tr')
for tr in table_rows:
    td = tr.find_all('td')
    row = [i.text for i in td]
    print(row)

print(row) 输出:

[]
['', 'CANDY', 'ALBANESE CONFEC', 'Albanese Confectionery Group', 'Gummi Sour Bears 12 Flavor', '12', '7 oz', '17.14', 'CS', '53328', '', 'ACG53328', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'ALBANESE CONFEC', 'Albanese Confectionery Group', 'Gummi Bears 12 Flavor', '12', '7.5 oz', '17.14', 'CS', '53348', '', 'ACG53348', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'ALBANESE CONFEC', 'Albanese Confectionery Group', 'Gummi Mini Worms 12 Flavor', '12', '7.5 oz', '17.14', 'CS', '53350', '', 'ACG53350', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'ALBANESE CONFEC', "Albanese World's Best", 'Gummi Bears 12 Flavor', '6', '9 oz', '11.59', 'CS', '53380', '', 'ACG53380', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'ALBANESE CONFEC', "Albanese World's Best", 'Gummi Mini Worms 12 Flavor', '6', '9 oz', '11.59', 'CS', '53381', '', 'ACG53381', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'ALBANESE CONFEC', "Albanese World's Best", 'Peach Rings', '6', '8 oz', '11.59', 'CS', '53383', '', 'ACG53383', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'ALBANESE CONFEC', "Albanese World's Best", 'Gummi Worms Mini Sour Neon', '6', '8 oz', '11.59', 'CS', '53384', '', 'ACG53384', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'ALBANESE CONFEC', "Albanese World's Best", 'Gummi Bears 12 Flavor', '12', '3.5 oz', '8.23', 'CS', '53450', '', 'ACG53450', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'ALBANESE CONFEC', "Albanese World's Best", 'Gummi Sherbet Bears 12 Flavor', '12', '3.5 oz', '8.23', 'CS', '53456', '', 'ACG53456', '', '\xa0\xa0\xa0\xa0']
['', 'CANDY', 'AMERICAN LICORI', 'Red Vines', 'Red Vines Orig Red Twists Bag', '12', '8 oz', '19.20', 'CS', '00232', '', 'AML00232', '', '\xa0\xa0\xa0\xa0']

所以我的问题是:如何从每一行中仅提取单元格 [11][7] 并将它们并排打印到 csv 中。例如,对于第 1 行,我想将 ACG53328(单元格 A)和 17.14(单元格 B)写入 csv 文件并继续向下。如果有什么不同的话,我没有在此处粘贴大约 4,000 条额外的行。

【问题讨论】:

  • 试试这个td_12 = tr.find_all('td')[12].text : td_08 = tr.find_all('td')[8].text
  • 我应该在哪里试试这个?我将它输入到打印功能中,它说语法无效。做 print(row[11], row[7]) 给了我我正在寻找的数据,但它只从这个列表的底行中提取单元格。我还需要将这些转换为 csv。
  • 网址是什么?

标签: python csv web-scraping html-table beautifulsoup


【解决方案1】:

类似下面的东西应该可以工作:

import csv
import requests
import urllib.request
from bs4 import BeautifulSoup

product_table = browser.page_source

soup = BeautifulSoup(product_table,'html.parser')
table = soup.find_all('table')[4]
with open('output.csv', 'w', newline="") as f:
    writer = csv.writer(f)
    writer.writerow(['SKU', 'TD_7'])
    for tr in table.find_all('tr'):
        try:
            td_12 = tr.find_all('td')[12].get_text(strip=True)
        except IndexError:
            td_12 = ""
        try:
            td_08 = tr.find_all('td')[8].get_text(strip=True)
        except IndexError:
            td_08 = ""
        writer.writerow([td_12, td_08])

【讨论】:

  • IndexError Traceback(最近一次调用最后一次) in 4 writer = csv.writer(f) 5 for tr in table.find_all('tr') : ----> 6 td_12 = tr.find_all('td')[11].get_text(strip=True) 7 td_08 = tr.find_all('td')[7].get_text(strip=True) 8 作家.writerow([td_12, td_08]) IndexError: list index out of range
  • 查看编辑。没有链接就很难提供任何解决方案。
  • 你做到了,干得好!我真的很感激帮助。我会研究你给我的作品,以便我能更好地理解它。我只将 td 更改为 [11] 和 [7] 以获取我需要的单元格,因为 0=1。是否可以在 TD_11 'SKU' 和 TD_7 'Case Price' 上方制作标题?
  • 完成了。查看更新,如果它帮助您解决问题,请确保按下我的答案旁边的灰色勾号。谢谢。
猜你喜欢
  • 2015-11-19
  • 2016-08-13
  • 2019-11-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多