Как использовать красивый суп, чтобы извлечь только один элемент из класса? - PullRequest
0 голосов
/ 22 февраля 2020

Я пытаюсь собрать информацию по сбору средств с помощью BeautifulSoup, и столкнулся с проблемой, пытаясь выделить такие элементы, как сумма, привлеченная для достижения цели по сбору средств.

Вот код на данный момент:

from bs4 import BeautifulSoup
import numpy as np
import pandas as pd
from time import sleep
import requests
import re
import json

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')
Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')[0].get_text()

Код работает, но когда я вижу результат, он выглядит так:

print(Amount_raised)
882,521 $ raised of 1,000,000 $ goal

В идеале, я хотел бы получить только число «882 521» или, что еще лучше, разобрать их на две переменные: одну с привлеченной суммой, а другую с целью сбора средств.

Мне кажется, что должен быть способ указать, какой элемент мне нужен, или использовать регулярные выражения для его выделения, но мои поиски не были плодотворными, и я довольно новичок в python.

Редактировать: это раздел HTML Я пытаюсь работать с

<h2 class="m-progress-meter-heading">882,521 $<!-- --> <span class="text-stat text-stat-title">raised of 1,000,000 $ goal</span>

Ответы [ 3 ]

1 голос
/ 22 февраля 2020

Я нашел самый простой способ сделать это:

Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')
print(Amount_raised[0].contents[0])

печатает $ 882,521


Нашел решение здесь: Только извлечение текста из этого элемента, но не его дочерних элементов
0 голосов
/ 22 февраля 2020

Если вы хотите получить как цель, так и сумму, фактически увеличенную, попробуйте:

amts = Amount_raised.split(' ')
locs = [i for i, x in enumerate(amts) if  "$" in x]
print('Amount raised: $'+amts[locs[0]-1])
print('Goal : $'+amts[locs[1]-1])

Вывод:

Amount raised: $882,521
Goal : $1,000,000
0 голосов
/ 22 февраля 2020

Вы можете работать с текстом, который вы получаете

Amount_raised.split(" ")[0]

Полный код:

from bs4 import BeautifulSoup
import requests

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')

Amount_raised = soup.find_all('h2', class_='m-progress-meter-heading')[0].get_text()
print(Amount_raised.split(" ")[0])

Вы также можете пропустить .get_text(), а затем вы можете найти и удалить тег <span> из <h2> (используя .extrude()) и далее вы можете использовать .get_text() для получения текста из <h2>

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
item.find('span').extrude()
Amount_raised = item.get_text()

Полный код:

from bs4 import BeautifulSoup
import requests

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
item.find('span').extract()
Amount_raised = item.get_text()
print(Amount_raised)

Вы также можете получить список со всеми strings в <h2>, и тогда текст из <span> будет отдельным элементом в списке

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
print( list(item.strings)[0] )

Полный код:

from bs4 import BeautifulSoup
import requests

page = requests.get("https://www.gofundme.com/f/eric-stevens-care-trust")
soup = BeautifulSoup(page.text, 'lxml')

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]
print(list(item.strings)[0])

РЕДАКТИРОВАТЬ: другие примеры:

item = soup.find_all('h2', class_='m-progress-meter-heading')[0]

print( item.next )
print( list(item.children)[0] )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...