python beautifulsoup抓取站点

问题描述 投票:2回答:2

我正在尝试学习Python以使用beautifulsoup抓取网站午餐菜单。我已提出要求

r = requests.get(url)
soup = BeautifulSoup(r.text, "html.parser")

响应看起来像这样:

<div class="lunchRow">
<div class="lunchRowDay"><h3>Monday</h3></div>
<div class="lunchRowItem"><div class="lunchRowItemActual">Meatballs</div>
<div class="lunchRowItemActual">Soup</div>
</div>
</div>
<div class="lunchRow">
<div class="lunchRowDay"><h3>Tuesday</h3></div>
<div class="lunchRowItem"><div class="lunchRowItemActual">Chicken</div>
<div class="lunchRowItemActual">Pork</div>
<div class="lunchRowItemActual">Fish</div>
</div>
</div>

每天获取LunchRowItemActual最简单的方法是什么?我首先搜索日期并获得下一个div,但此后我迷路了,我认为这不是解决问题的方法。

soup = soup.find(string="Monday").find_next('div').contents[0].text
python beautifulsoup scrape
2个回答
1
投票

首先,您应该尝试通过其类名获取所有LunchRow div并将其保存到这样的变量中:

rows = soup.findAll('div', attrs={'class': 'lunchRow'})

然后,我们可以遍历它们,并按如下方式获取各个日期和项目。在这里,我们获得第一个/唯一的LunchRowDay项目,然后在当前行中查找所有LunchRowItemActual元素:

for row in rows:
  print(row.find('div', attrs={'class': 'lunchRowDay'}).text)
  actuals = row.findAll('div', attrs={'class': 'lunchRowItemActual'})
  for actual in actuals:
    print(actual.text)

此输出为:

Monday
Meatballs
Soup
Tuesday
Chicken
Pork
Fish

不是将它们打印出来,您最有可能希望将其以LunchRowDay作为键放入字典中,然后将LunchRowItemActual值放入列表中,但这取决于您。


0
投票

soup.select是执行类似操作的好方法

然后使用get_text ...获取文本

并且一些列表理解将把get_text应用于整个列表

days = soup.select("div.lunchRowDay")
for day in days:
    print(day.get_text())
    items = [item.get_text() for item in day.select("div.lunchRowItemActual")]
    print(items)
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.