【问题标题】:Python - issues with for loops to create dataframe with BeautifulSoup scrapePython - 使用 BeautifulSoup scrape 创建数据帧的 for 循环问题
【发布时间】:2020-04-21 03:37:14
【问题描述】:

我是 Python 的初学者,我正在尝试使用 BeautifulSoup 创建一个新的数据框来抓取网页。我正在关注一些在不同页面中工作的代码,但它在这里不起作用。我的最终数据表是空白的,所以它似乎没有附加。任何帮助表示赞赏。这就是我所做的:

from bs4 import BeautifulSoup
import requests
import pandas as pd

allergens = requests.get(url = 'http://guetta.com/diginn/allergens/')
allergens = BeautifulSoup(allergens.content)

items = allergens.find_all('div', class_ = 'menu-item-card')

final_table = {}

for item in allergens.find_all('div', class_ = 'menu-item-card'):
    for row in item.find_all('h4', recursive = False)[0:]:
        for column in row.find_all('p', class_ = 'menu-item__allergens'):
            col_name = column['class'][0].split('__')[1]

            if col_name not in final_table:
                final_table[col_name] = []

            final_table[col_name].append(column.text)

df_allergens = pd.DataFrame(final_table)

这不返回任何内容。没有错误,只是空括号。我能够单独检索每个元素,所以我认为这些项目应该可以工作,但显然我错过了一些东西。

编辑: 以下是输出需要的内容:

Item Name     Allergens
Classic Dig | Soy
Item2       | allergen1, allergen2
Item3       | allergen2

【问题讨论】:

  • 首先看这里,该网站加载了JavaScriptbs4requests 不会帮你渲染JS,你可以使用像selenium 这样的真实浏览器。也请edit您的问题并向我们展示所需数据的样本。我们可能有不同的解决方案
  • 我添加了输出应该是什么。我希望第一列是项目名称,第二列是过敏原列表。

标签: python-3.x pandas beautifulsoup


【解决方案1】:

您不需要在每个项目中找到所有h4 标签。因此,请进行如下更改:

...
for item in allergens.find_all('div', class_ = 'menu-item-card'):

    for column in item.find_all('p', class_ = 'menu-item__allergens'):
        col_name = column['class'][0].split('__')[1]

        if col_name not in final_table:
            final_table[col_name] = []

        final_table[col_name].append(column.text)
...

【讨论】:

  • 这给了我结果,所以谢谢你。我确实希望项目名称作为第一列,第二列描述过敏原。如何添加具有项目名称的另一列?
猜你喜欢
  • 1970-01-01
  • 2023-03-19
  • 1970-01-01
  • 2021-04-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-26
  • 2022-06-23
相关资源
最近更新 更多