使用 BeautifulSoup 抓取使用 Spry 框架构建的 table

Scrape table built with Spry framework using BeautifulSoup

此页面包含 table 我想删除 BeautifulSoup:
Flavors of Cacao - Chocolate Database

table 位于 ID 为 spryregion1div 内,但是它无法通过 ID 定位,因此我将其定位为 table,然后找到所有的 tr 元素。

列标题包含在 th 个元素中,每行条目包含在 td 中。我尝试了几种方法,但无法抓取所有行并将它们放入 CSV 文件中。

谁能给我一些help/advice?谢谢!

An article I found on creating Spry Regions

您要查找的 table 不包含在您请求的页面的 HTML 中。该页面使用 Javascript 请求包含它的另一个 HTML 文档,然后使用您正在寻找的 <div> 包装该文档。

要获取 table,您可以使用浏览器工具来识别页面正在请求的 URL,然后使用它来获取您需要的页面:

import requests
from bs4 import BeautifulSoup
import csv

r = requests.get("http://flavorsofcacao.com/database_w_REF.html")
soup = BeautifulSoup(r.content, "html.parser")

with open('output.csv', 'w', newline='', encoding='utf-8') as f_output:
    csv_output = csv.writer(f_output)
    csv_output.writerow([th.get_text(strip=True) for th in soup.table.tr.find_all('th')])

    for tr in soup.table.find_all("tr")[1:]:
        csv_output.writerow([td.get_text(strip=True) for td in tr.find_all('td')])

从那里您可以首先通过搜索 <th> 条目提取 header 行,然后迭代所有行。可以使用 Python 的 CSV 库将数据写入 CSV 文件。

给你一个 output.csv 文件开头:

Company (Maker-if known),Specific Bean Origin or Bar Name,REF,Review Date,Cocoa Percent,Company Location,Rating,Bean Type,Broad Bean Origin
A. Morin,Bolivia,797,2012,70%,France,3.5,,Bolivia
A. Morin,Peru,797,2012,63%,France,3.75,,Peru
A. Morin,Brazil,1011,2013,70%,France,3.25,,Brazil

使用 Python 3.6.3

测试