Красивый суп Python не находит элемент span - PullRequest
0 голосов
/ 08 ноября 2018

Я тестирую Instagram на следующей странице Instagram: https://www.instagram.com/acmilan/ и пытаюсь получить элемент posts (прямо сейчас = '4,552 posts'). Если я осматриваю страницу, HTML выглядит как прикрепленный скриншот. Мой код для поиска этого элемента:

driver = webdriver.Chrome
soup = BeautifulSoup(driver.page_source, 'html.parser')
elements = soup.find_all("ul", text=re.compile("posts"))
print(len(elements))

но это ничего не находит. Затем я попробовал:

elements = soup.find_all("span", text=re.compile("posts"))
print(len(elements))

и до сих пор ничего. Затем я попробовал:

elements = soup.find_all(True, text=re.compile('posts'))

и снова ничего. enter image description here

это кажется довольно легкой задачей, но почему-то я не могу найти решение. Какие-либо предложения? Спасибо

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

, чтобы получить количество сообщений, которые вам не нужны BeautifulSoup или selenium, используйте regex или даже лучше, используя json

import requests
import re
import json

url = 'https://www.instagram.com/acmilan/'
page = requests.get(url)
postCount = re.search('timeline_media":{"count":(\d+)', page.text)
print('regex: ' + postCount.groups()[0])

# using json
jString = re.search('window._sharedData = (\{.+?\});</script>', page.text)
json_data = json.loads(jString.groups()[0])
postCount = json_data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['count']
print('json: ' + str(postCount))

# to show all json object
# print(json_data)
0 голосов
/ 08 ноября 2018

Вот как я справился с этим кодом. Убедитесь, что вы установили модуль re.

from bs4 import BeautifulSoup
import requests
import re
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.95 Safari/537.36'}

url = 'https://www.instagram.com/acmilan/'
page = requests.get(url, headers=headers)
soup = BeautifulSoup(page.text, 'html.parser')
find = soup.findAll('meta')
meta = re.findall('g,.+\ Posts', str(find))[0]
print(meta.replace('g, ', '').replace('Posts', ''))

Output: 4,552 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...