python - 从另一个标签中抓取文本
问题描述
编辑:我注意到我混淆了一个脚本的代码和另一个脚本的输出。这是具有正确输出的正确代码
<div class="ingredient-list single-column">
<div class="ingredient-list__part">
<ul aria-labelledby="ingredients-title">
<li>
<span class="ingredient">
<span class="ingredient__product">aardappel (vastkokend)</span>
<span class="ingredient__unit">1 kg</span>
</span>
</li>
<li>
<span class="ingredient">
<span class="ingredient__product">sjalot</span>
<span class="ingredient__unit">1</span></span>
</li>
<li> ...
我正在尝试分别使用成分__product 和成分__unit 提取跨度内的信息。
我写的代码如下:
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup
my_url = "https://dagelijksekost.een.be/gerechten/makreel-met-aardappelen-in-de-schil-en-rode-biet"
#open connectie en pagina pakken
uClient = uReq(my_url)
page_html = uClient.read()
uClient.close()
#html parsen
page_soup = soup(page_html, "html.parser")
ingredients = page_soup.find("ul",{"aria-labelledby":"ingredients-title"})
ingredient = ingredients.findAll('li')
for i in range(len(ingredient)):
print(ingredient[i].text.strip())
这是我的第一次尝试,并返回给我这个输出:
- 1 公斤
- 1 条
- ...
我想分隔跨度标记中的信息,所以我尝试修改我的代码如下:
ingredients = page_soup.find_all("span", {"class": "ingredient"})
print(ingredients)
这只会打印一个空列表。似乎我无法“访问”跨度标签之间的信息
我究竟做错了什么?
如果我已经解决了这一步,下一步就是在这个网站上循环浏览多个食谱。任何关于如何在 gerechten/ 之后的部分是可变的 URL 中循环的提示也是受欢迎的。
解决方案
用于find_all
获取所有<span>
标签,class="ingredient"
然后循环遍历结果,然后解析数据,如下面的代码:
ingredients = page_soup.find_all("span", {"class": "ingredient"})
for ingredient in ingredients:
print("ingredient product: ", ingredient.find(class_='ingredient__product').text)
print("ingredient unit: ", ingredient.find(class_='ingredient__unit').text)
print("-")
编辑: 从 JS 中的成分变量中解析数据,尽管我建议使用 Selenium 和像 PhantomJS 这样的网络浏览器来获取从 html 代码中的 javascript 中提取的数据:
import json
import re
load = json.loads(re.findall(r"var ingredients = (.*?);", str(page_soup))[0])
for i in load:
if i['unit'] != None:
print("unit:", i["amount"], i["unit"]["name"])
else:
print("unit:", i["amount"])
print("product:", i["product"]["name"], i["append"])
print("-")
输出:
unit: 1 kg
product: aardappel (vastkokend)
-
unit: 1
product: sjalot
-
unit: 0
product: rode wijnazijn
-
unit: 4
product: rode biet (gekookt)
-
...
推荐阅读
- c# - 为什么在使用非短路 AND 运算符时会取消引用可能为空的引用警告?
- javascript - 无法在 Edge 中执行 document.execCommand
- user-interface - Xamarin forms - 创建复杂的自定义控件(创建多个交通标志)
- c# - 如何关闭另一个进程的进程?
- angularjs - 在角度 JS 中注销后防止返回按钮
- iis - 502 - Web 服务器在充当网关或代理服务器时收到无效响应。IIS
- c++ - 如何在 C++ 中创建不同数量的线程?
- python - 使用 openweather API 将 json 加载到 pandas 数据框
- typo3 - 切换域后无法登录后台
- angular - 在迁移到 Angular 9 期间中断服务