Неожиданные результаты при попытке получить метаданные с BeautifulSoup

Если у вас длинный список, я бы предложил два подхода:

Первое решение:

Добавить все данные во временную таблицу:

CREATE TEMP TABLE lng_list(image_address);
-- Insert all you elements in lng_list table
-- ...
DELETE FROM images WHERE image_address NOT IN (SELECT image_address FROM lng_list);

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

Второе решение:

(УДАЛЕНО: работает только для IN, а не NOT IN ...)

Производительность должна быть справедливой для любого из эти решения.

0
задан chb 17 January 2019 в 03:28
поделиться

2 ответа

Правильный способ сопоставления этих тегов заключается в следующем:

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                   
0
ответ дан Barmar 17 January 2019 в 03:28
поделиться

Кажется, это работает:

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

По сути, вы перебираете все теги на странице и ищете те, для которых свойство имеет значение «og: description», которое выглядит как Откройте свойство 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}")

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

0
ответ дан AndroidNoobie 17 January 2019 в 03:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: