Извлечь элемент из HTML с помощью библиотеки BeautifulSoup Python - PullRequest
0 голосов
/ 11 сентября 2018

Я хочу извлечь данные из Instagram и записать время публикации без использования аутентификации.

В приведенном ниже коде приведен HTML-код страниц из сообщения IG, но я не могу извлечь элемент времени из HTML.

from requests_html import HTMLSession
from bs4 import BeautifulSoup
import json

url_path = 'https://www.instagram.com/<username>'
session = HTMLSession()
r = session.get(url_path)

soup = BeautifulSoup(r.content,features='lxml')
print(soup)

Я хотел бы извлечь данные из элемента времени в нижней части этого скриншота

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Я предполагаю, что фотография, которой вы поделились, является скриншотом инспектора браузера. Хотя проверка кода является хорошим базовым руководством по поиску в Интернете, вы должны проверить, что получает BeautifullSoup. Если вы проверите печать soup, вы увидите, что данные, которые вы ищете, представляют собой json внутри тега сценария. Таким образом, ваш код и любое другое решение, предназначенное для тега time, не работают на BS4. Вы можете попробовать с селеном, может быть. В любом случае, здесь идет псевдо-решение BeautifullSoup с использованием Instagram из вашего скриншота:

from bs4 import BeautifulSoup
import json
import re
import requests
import time

url_path = "https://www.instagram.com/srirachi9/"
response = requests.get(url_path)
soup = BeautifulSoup(response.content) 
pattern = re.compile(r"window\._sharedData\ = (.*);", re.MULTILINE)
script = soup.find("script", text=lambda x: x and "window._sharedData" in x).text

data = json.loads(re.search(pattern, script).group(1))

times = len(data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges'])
for x in range(times):
    time.strftime('%Y-%m-%d %H:%M:%S', time.localtime(data['entry_data']['ProfilePage'][0]['graphql']['user']['edge_owner_to_timeline_media']['edges'][x]['node']['taken_at_timestamp']))

Переменная times это количество временных меток, которые содержит json. Это может выглядеть как ад, но это просто вопрос терпеливого следования структуре JSON и индексации соответственно.

0 голосов
/ 11 сентября 2018

для извлечения времени вы можете использовать html-тег и его класс:

time = soup.findAll("time", {"class": "_1o9PC Nzb55"}).text
...