Получите свойство содержимого метатега с помощью 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)