编辑:我注意到我混合了一个脚本的代码和另一个脚本的输出。这是具有正确输出的正确代码
<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> ...
我正尝试分别使用成分__产品和成分__单位提取范围内的信息。
我编写的代码如下:
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())
这是我的第一次尝试,并向我返回此输出:
我想分隔span标签中的信息,所以我尝试如下修改代码:
ingredients = page_soup.find_all("span", {"class": "ingredient"})
print(ingredients)
这仅打印一个空列表。似乎我无法“访问”跨度标签之间的信息
我在做什么错了?
如果我已解决此步骤,则下一步将是在该站点上循环浏览多个食谱。也欢迎提供任何关于如何在gerechten /之后的部分可变的URL中循环的技巧。
答案 0 :(得分:0)
使用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)
-
...
答案 1 :(得分:0)
您感兴趣的格式化项目位于某些脚本标签内。尝试执行以下操作以从该脚本标记中挖掘所需的项。
import re
import json
import requests
link = 'https://dagelijksekost.een.be/gerechten/makreel-met-aardappelen-in-de-schil-en-rode-biet'
res = requests.get(link)
json_obj = json.loads(re.findall(re.compile(r"var ingredients =(.*?);",re.DOTALL), res.text)[0])
for ingrdnt in json_obj:
print(ingrdnt['product']['name'])
您可能拥有的输出如下:
aardappel
sjalot
rode wijnazijn
rode biet
lente-ui
augurken