Получите свойство содержимого метатега с помощью BeautifulSoup и Python

Я пытаюсь использовать python и красивый суп, чтобы извлечь часть содержимого тегов ниже:

<meta property="og:title" content="Super Fun Event 1" />
<meta property="og:url" content="http://superfunevents.com/events/super-fun-event-1/" />

Я получаю BeautifulSoup, чтобы загрузить страницу просто отлично и найти другие вещи (это также захватывает идентификатор статьи из тега id, скрытого в источнике), но я не знаю, как правильно искать html и находить эти биты, я пробовал варианты поиска и findAll безрезультатно. Теперь код перебирает список URL-адресов...

#!/usr/bin/env python
# -*- coding: utf-8 -*-

#importing the libraries
from urllib import urlopen
from bs4 import BeautifulSoup

def get_data(page_no):
    webpage = urlopen('http://superfunevents.com/?p=' + str(i)).read()
    soup = BeautifulSoup(webpage, "lxml")
    for tag in soup.find_all("article") :
        id = tag.get('id')
        print id
# the hard part that doesn't work - I know this example is well off the mark!        
    title = soup.find("og:title", "content")
    print (title.get_text())
    url = soup.find("og:url", "content")
    print (url.get_text())
# end of problem

for i in range (1,100):
    get_data(i)

Если кто-нибудь может помочь мне отсортировать бит, чтобы найти заголовок og: title и og:, который был бы фантастическим!

Ответ 1

Укажите имя тега meta в качестве первого аргумента find(). Затем используйте аргументы ключевых слов для проверки определенных атрибутов:

title = soup.find("meta",  property="og:title")
url = soup.find("meta",  property="og:url")

print(title["content"] if title else "No meta title given")
print(url["content"] if url else "No meta url given")

Проверка if/else здесь будет необязательной, если вы знаете, что мета-свойства title и url всегда будут присутствовать.

Ответ 2

попробуйте следующее:

soup = BeautifulSoup(webpage)
for tag in soup.find_all("meta"):
    if tag.get("property", None) == "og:title":
        print tag.get("content", None)
    elif tag.get("property", None) == "og:url":
        print tag.get("content", None)

Ответ 3

могу ли я задать следующий вопрос?

Я пытаюсь получить <meta name='keywords' content=''></> с помощью bs4, но вместо этого получаю результат одной строки, я получаю весь мета-блок. Вы случайно не знаете, почему?

Разбор сайта: https://www.bilibili.com/video/av6862467/#page=4

Целевой блок:

<meta name="keywords" content="【SNH48】20161028 原创公演 TeamX《梦想的旗帜》首演 全场 CUT,娱乐,明星,SNH48-TeamX应援会,,哔哩哔哩,Bilibili,B站,弹幕" />

код:

metatags = soup.find_all('meta',attrs={'name':'keywords'})                                                             
for tag in metatags:
    print(tag)