Python BeautifulSoup извлекает текст из SPAN и тегов A

#python #beautifulsoup

Вопрос:

Я хочу извлечь текст из SPAN и тегов и поместить в список, как эта схема:

[«Фарина», «500 г»][«Uova», «1»] [«Распродажа»,»100 г»]

соскабливание с BeautifulSoup

 from bs4 import BeautifulSoup
import re
import string

markup = """
<dd class="ingredient">
    <a href="#">Farina</a>
    <span>500 g</span>
</dd>
<dd class="ingredient">
    <a href="#">Uova</a>
    <span>1</span>
</dd>
<dd class="ingredient">
    <a href="#">Sale</a>
    <span>100 g</span>
</dd>
"""

soup = BeautifulSoup(markup, 'html.parser')

allIngredients = []
for tag in soup.find_all(attrs={'class' : 'ingredient'}):
    #[tag.text for tag in tags]
    link = tag.a.get('href')
    nameIngredient = tag.a.string

    contents = tag.span.text
    quantityIngredient = re.sub(r"s ", " ", contents).strip()
    allIngredients.append([nameIngredient, quantityIngredient])

print(allIngredients)
 

иногда ПРОМЕЖУТОК может быть пустым или не существовать

Комментарии:

1. поделитесь этой страницей link здесь, чем я вам помогу

2. <класс dd=»ингредиент»> <класс dd=»ингредиент»><a href=»#»>Продажа<a href=»#»></a> </a><span>100 г</span> </dd>

Ответ №1:

Вот решение, использующее lxml (вместо bs4 )

 from lxml import html

markup = """
<dd class="ingredient">
    <a href="#">Farina</a>
    <span>500 g</span>
</dd>
<dd class="ingredient">
    <a href="#">Uova</a>
    <span>1</span>
</dd>
<dd class="ingredient">
    <a href="#">Sale</a>
    <span>100 g</span>
</dd>
<dd class="ingredient">
    <a href="#">Vino</a>
</dd>
"""

root = html.fromstring(markup)
result = []
for node in root.xpath(".//dd"):
    a = node.xpath(".//a")
    span = node.xpath(".//span")
    result.append((
        a[0].text_content() if a else None, 
        span[0].text_content() if span else None
    ))


print(result)
# [('Farina', '500 g'), ('Uova', '1'), ('Sale', '100 g'), ('Vino', None)]
 

Комментарии:

1. я постараюсь, я должен изменить весь сценарий, я не программист

2. Почему с тегом SPAN я не могу использовать .text или .string?

3. Я думаю, что метод, который вы ищете, может быть .text_content

4. lxml показать [(‘Авокадо’, ‘ntttttt t t t(2)nttttt ttttttttttt t t 500…

5. результат = [] для узла в root.xpath(‘.//dd[@class=»gz-ингредиент»]’): a = node.xpath(‘нормализовать пространство(.//a/текст()[нормализовать пространство()])’) span = node.xpath(‘нормализовать пространство(.//span/текст()[нормализовать пространство()])’) результат.добавить(( #a[0].text_content() если другого нет, #span[0].text_content() если span еще нет #если a еще нет, #если span еще нет a, span ))