не удается получить текст span внутри ul с помощью beautifulsoup

#python #web-scraping #beautifulsoup

Вопрос:

Я пытаюсь собрать обзоры с веб-сайта, чтобы быть точным, я пытаюсь получить тексты внутри span, но я не получаю никаких результатов. Я новичок в Python и scraping, поэтому я не знаю точно, что я делаю.

Код:

 from bs4 import BeautifulSoup
import requests

url = "https://forum.bouyguestelecom.fr"
req = requests.get(url).text

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

activites = soup.find_all('div', class_="RF_CONTENT")

for activite in activites:
    NickName = activite.find("span", class_="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_NICKNAME").text
    Name = activite.find("span", class_="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_ACH_NAME").text
    print(NickName)
    print(Name)
 

Вот HTML, из которого я пытаюсь получить данные:

 <div class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME">
<div class="RF_CONTENT">
<p><a href="https://forum.bouyguestelecom.fr/questions/2814793-trouve-inadmissibile-ligne-active-partir-20-novembre-realiser-commande-3-11" target="_blank">

<span class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_NICKNAME">Celia q.</span>
    <span class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_ACTION"> a posé une question: Je trouve inadmissibile que ma ligne ne soit active qu'a partir du 20 novembre en ayant réaliser la commande le 3/11 ?</span><span class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_RESUME_DATETIME">Il y a 2 minute(s)</span></a>
</p>

<div class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_SCORE">20  <span class="RF_TEXT_INDICE"> pts</span></div></div>
</div></li><li class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM">

<div class="RFW_ACTIVITY_SECTION_ACTIVITY_FEED_ELEM_PERFORMER">
<img src="https://api.rocketfid.com/media/default/rainbow/user/" alt="">
</div>
 

Вы можете увидеть это сами здесь. Мой код не возвращает результатов.

вот фото отзывов : Отзывы

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

1. Я взглянул на веб-сайт и код. Похоже, что либо указанный вами URL-адрес неверен, либо тот popup , который отображается при вводе, маскирует нужный вам html.

2. Кроме того, источник информации неясен. Можете ли вы предоставить изображение того, какие обзоры вы хотите извлечь?

3. Да, конечно, я предоставлю фотографию в сообщении

4. Это динамическое отображение означает, что загрузка занимает некоторое время, поэтому вы не можете извлекать из bs4 него только статические данные, поэтому вы должны использовать selenium для этого

5. спасибо вам, мауч, за этот совет, как я уже сказал, я новичок в этом, поэтому я начну искать решение selenuim

Ответ №1:

Вы можете проанализировать эти данные, сделав прямой запрос к API / серверу веб-сайта, не используя selenium для такой задачи.


Код и пример в онлайн-среде разработки:

Как насчет user-agent того, если no user-agent передается в запрос headers при использовании requests библиотеки, по умолчанию используются python-запросы, поэтому веб-сайты могут понять, что это бот / скрипт, и заблокировать запрос. Проверьте, что у вас user-agent .

В этом случае это будет работать без user-agent , но в большинстве случаев это необходимо для «реального» посещения пользователя, но опять же, user-agent в некоторых случаях только добавления будет недостаточно, если это так, необходимо добавить дополнительные заголовки запросов.

 import requests, json

headers = {
    "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36",
    "content-type": "application/json",
    "x-instance": "rainbow"  # only this matter, otherwise it will blow up with 501 error
}

response = requests.get("https://api.rocketfid.com/activity/cache/all/0/5/", headers=headers).text

# print data to see the actual JSON string
# and grab additional data you want the same way as shown below
# simpy add additional variable and access it by KEY
data = json.loads(response)

for result in data:
    nick_name = result["performer"]["nickname"].title()

    # if data in achievement is empty -> then its located in the action key
    # using try/except is a one way of handling it
    try:
        name = result["achievement"]["name"]
    except:
        name = result["action"]["name"]

    try:
        score = result["achievement"]["score"]
    except:
        score = result["action"]["score"]

    # additional data here.. 

    print(f"{nick_name}n{name}n{score}n")


# output
'''
Adrien S.
En savoir plus
10

Adrien S.
 a posé une question: Remboursement clé 4g ?
20

Marie-Claude P.
Première fois
20

Marie-Claude P.
 a répondu à la question: Comment supprimer l’autre numéro de contact dans mes préférences de contact ?
10

Marie-Claude P.
a fait la première réponse à une question
20
'''