Неожиданные результаты при попытке получить метаданные с BeautifulSoup - PullRequest
0 голосов
/ 17 января 2019

Хорошо, вот что я пытаюсь сделать. Я довольно новичок в Python, и я только начинаю справляться с этим. В любом случае, с помощью этого небольшого инструмента я пытаюсь извлечь данные со страницы. В этом случае я хочу, чтобы пользователь ввел URL и вернул

<meta content=" % Likes, % Comments - @% on Instagram: “post description []”" name="description" /> 

Однако замените % на количество лайков / комментариев и т. Д., Которые есть в этом сообщении.

Вот мой полный код:

from urllib.request import urlopen
from bs4 import BeautifulSoup
import requests
import re

url = "https://www.instagram.com/p/BsOGulcndj-/"
page2 = requests.get(url)
soup2 = BeautifulSoup(page2.content, 'html.parser')
result = soup2.findAll('content', attrs={'content': 'description'})
print (result)

Но всякий раз, когда я запускаю его, мне дают []. Что я делаю не так?

Ответы [ 2 ]

0 голосов
/ 17 января 2019

Правильный способ сопоставления этих тегов:

result = soup2.findAll('meta', content=True, attrs={"name": "description"})

Однако html.parser неправильно анализирует теги <meta>. Он не понимает, что они самозакрывающиеся, поэтому он включает в себя большую часть остальной части <head>. Я изменил на

soup2 = BeautifulSoup(page2.content, 'html5lib')

, а затем результат вышеуказанного поиска был:

[<meta content="46.3m Likes, 2.6m Comments - EGG GANG ? (@world_record_egg) on Instagram: “Let’s set a world record together and get the most liked post on Instagram. Beating the current…”" name="description"/>]
0 голосов
/ 17 января 2019

Это похоже на работу:

for tag in soup2.findAll("meta"):
    if tag.get("property", None) == "og:description":
        print(tag.get("content", None))

По сути, вы перебираете все теги на странице и ищете те, для которых свойство имеет значение «og: description», которое, по-видимому, является требуемым свойством Open Graph.

Это помогает?

Полная версия:

from bs4 import BeautifulSoup
import requests

url = "https://www.instagram.com/p/BsOGulcndj-/"
page2 = requests.get(url)
soup2 = BeautifulSoup(page2.content, 'html.parser')
result = soup2.findAll('meta', attrs={'content': 'description'})

for tag in soup2.findAll("meta"):
    if tag.get("property", None) == "og:description":
        print(tag.get("content", None))

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

likes = re.search('(.*)Likes', string).group(1)
comments = re.search(',(.*)Comments', string).group(1)
description = re.search('-(.*)', string).group(1)

print(f"{likes} Likes | {comments} Comments | {description}")

Но если у вас есть другой вопрос по этому поводу, его, вероятно, следует задать в новом сообщении.

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