Получить номер из тега span, используя запросы Python и красивый суп

Я новичок в python и html. Я пытаюсь получить количество комментариев со страницы, используя запросы и BeautifulSoup.

В этом примере я пытаюсь получить номер 226. Вот код, как я вижу его, когда я проверяю страницу в Chrome:

<a title="Go to the comments page" class="article__comments-counts" href="http://www.theglobeandmail.com/opinion/will-kevin-oleary-be-stopped/article33519766/comments/">
    <span class="civil-comment-count" data-site-id="globeandmail" data-id="33519766" data-language="en">
    226
    </span>
    Comments
</a>

когда я запрашиваю текст из URL, я могу найти код, но между тегами span нет содержимого, нет 226. Вот мой код:

import requests, bs4

url = 'http://www.theglobeandmail.com/opinion/will-kevin-oleary-be-stopped/article33519766/'
r = requests.get()
soup = bs4.BeautifulSoup(r.text, 'html.parser')

span = soup.find('span', class_='civil-comment-count')

он возвращает это, как и выше, но нет 226.

<span class="civil-comment-count" data-id="33519766" data-language="en" data-site-id="globeandmail">
</span>

Я в недоумении, почему значение не появляется. Заранее спасибо за любую помощь.

2 ответов


страница, и в частности количество комментариев, включает JavaScript для загрузки и отображения. Но,вам не нужно использовать селен, сделайте запрос к API за ним:

import requests

with requests.Session() as session:
    session.headers = {"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.95 Safari/537.36"}

    # visit main page
    base_url = 'http://www.theglobeandmail.com/opinion/will-kevin-oleary-be-stopped/article33519766/'
    session.get(base_url)

    # get the comments count
    url = "https://api-civilcomments.global.ssl.fastly.net/api/v1/topics/multiple_comments_count.json"
    params = {"publication_slug": "globeandmail",
              "reference_language": "en",
              "reference_ids": "33519766"}
    r = session.get(url, params=params)
    print(r.json())

принты:

{'comment_counts': {'33519766': 226}}

эта страница использует JavaScript для получения номера комментария, вот как выглядит страница при отключении JavaScript: enter image description here

вы можете найти реальный url, который содержит номер в инструментах разработчика Chrome: enter image description here

чем вы можете имитировать запросы с помощью кода @alecxe.