Очистка метатегов с помощью BS4 или Newspaper3k в Python - PullRequest
0 голосов
/ 09 мая 2020

После тщательного поиска и множества вариаций я в растерянности. Я знаю, что BS4 (я также пробовал 3) должен иметь возможность очищать метатеги, но я не могу заставить его работать. Рассматриваемые мета-теги закрыты <properly />, так что это не так. Они всегда есть (хотя я и поставил ловушку на случай), так что это не так. Я пробовал петли, пробовал разные форматы для одного и того же. Я даже пробовал Newspaper и Newspaper3k. Наконец, я попробовал библиотеки l xml, html5lib и html .parser, но все безрезультатно.

Любой совет поможет ... пожалуйста.

My HTML исходный код выглядит так:

<meta name="description" content="Here is an exclusive we just got in regarding toda...." />
<meta property="og:description" content="Here is an exclusive we just got in regarding toda...." />
<meta property="article:section" content="Breaking News" />

а мой python код выглядит так:

# Import requisite libraries
from bs4 import BeautifulSoup


# Start it up (and note I have also tried lxml and html.parser)
soup = BeautifulSoup(corpus, 'html5lib')
# corpus is holding data from Newspaper3k. This aspect works.


# Following is just me trying different ways to find the same 2 things:

# Retrieve description AKA summary
description = soup.find("meta",  property="og:description")  # 1st way
summary = soup.find("meta",  attrs={'name': "description"})  # 2nd way

# Retrieve category AKA section
category = soup.find("meta",  property='article:section')  # 1st way
section = soup.find("meta",  attrs={'article': "section"})  # 2nd way


# Test and return result
print(description["content"] if description else "No description given")
print(summary["content"] if summary else "No summary given")
print(category["content"] if category else "No category given")
print(section["content"] if section else "No section given")
  • Он всегда возвращает:

    No description given
    No summary given
    No category given
    No section given
    

1 Ответ

0 голосов
/ 09 мая 2020

Ладно ... Я решил. Проблема заключалась в том, что я использовал корпус, взятый из Newspaper3k, в качестве набора данных. Не поймите меня неправильно ... это работает так, как написано на этикетке ... но мета-тегов там не будет, так как он только выводит текст статьи и авторов.

Однако, когда я вместо этого использую BS4 для извлечения данных, он фактически также извлекает базовые данные (а не только тело статьи), что означает, что теперь у него есть метатеги.

Мы можем закрыть это, спасибо за терпение.

Правильный код будет выглядеть так:

    url = urllib.request.urlopen('https://www.someurl.com/breakingnews/this-just-in/')
    content = url.read()
    soup = BeautifulSoup(content, 'lxml')

    description = soup.find("meta",  property="og:description")
    summary = soup.find("meta",  attrs={'name': "description"})
    category = soup.find("meta",  property='article:section')

    print(description["content"] if description else "No description given")
    print(summary["content"] if summary else "No summary given")
    print(category["content"] if category else "No category given")

, а затем все остальное, как прежде.

...