从另一个<span>标记内的<span>刮取文本

时间:2019-11-23 10:33:44

标签: python html web-scraping beautifulsoup

编辑:我注意到我混合了一个脚本的代码和另一个脚本的输出。这是具有正确输出的正确代码

<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())

这是我的第一次尝试,并向我返回此输出:

  • 1公斤aardappel
  • 1 sjalot
  • ...

我想分隔span标签中的信息,所以我尝试如下修改代码:

ingredients = page_soup.find_all("span", {"class": "ingredient"})

print(ingredients)

这仅打印一个空列表。似乎我无法“访问”跨度标签之间的信息

我在做什么错了?

如果我已解决此步骤,则下一步将是在该站点上循环浏览多个食谱。也欢迎提供任何关于如何在gerechten /之后的部分可变的URL中循环的技巧。

2 个答案:

答案 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