Как получать точные заголовки с веб-страниц без включения данных сайта - PullRequest
0 голосов
/ 12 июля 2020

Я нашел эту ссылку [и несколько других], в которой немного говорится о BeautifulSoup для чтения html. В основном он делает то, что я хочу, захватывает заголовок для веб-страницы.

def get_title(url):
    html = requests.get(url).text
    if len(html) > 0:
        contents = BeautifulSoup(html)
        title = contents.title.string
        return title
    return None

Проблема, с которой я сталкиваюсь, заключается в том, что иногда статьи возвращаются с метаданными, прикрепленными в конце с помощью «- some_data». Хорошим примером является эта ссылка на BB C Sport article, в которой указано название:

Джек Чарльтон: Победитель чемпионата мира 1966 года в Англии умер в возрасте 85 лет - BB C Спорт

Я мог бы сделать что-нибудь простое, например, отрезать что-нибудь после последнего символа «-»

title = title.rsplit(', ', 1)[0]

Но это предполагает, что любая мета существует после значения «-». Я не хочу предполагать, что никогда не будет статьи, название которой заканчивается на "- part_of_title"

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

Моя текущая мысль - продолжать использовать BeautifulSoup и просто добавьте fuzzywuzzy , что, честно говоря, также поможет с небольшими орфографическими ошибками или различиями в пунктуации. Но я определенно предпочел бы начать с места, которое включало сравнение с точными названиями.

1 Ответ

0 голосов
/ 13 июля 2020

Вот как reddit обрабатывает получение данных заголовка.

https://github.com/reddit-archive/reddit/blob/40625dcc070155588d33754ef5b15712c254864b/r2/r2/lib/utils/utils.py#L255

def extract_title(data):
    """Try to extract the page title from a string of HTML.
    An og:title meta tag is preferred, but will fall back to using
    the <title> tag instead if one is not found. If using <title>,
    also attempts to trim off the site's name from the end.
    """
    bs = BeautifulSoup(data, convertEntities=BeautifulSoup.HTML_ENTITIES)
    if not bs or not bs.html.head:
        return
    head_soup = bs.html.head

    title = None

    # try to find an og:title meta tag to use
    og_title = (head_soup.find("meta", attrs={"property": "og:title"}) or
                head_soup.find("meta", attrs={"name": "og:title"}))
    if og_title:
        title = og_title.get("content")

    # if that failed, look for a <title> tag to use instead
    if not title and head_soup.title and head_soup.title.string:
        title = head_soup.title.string

        # remove end part that's likely to be the site's name
        # looks for last delimiter char between spaces in strings
        # delimiters: |, -, emdash, endash,
        #             left- and right-pointing double angle quotation marks
        reverse_title = title[::-1]
        to_trim = re.search(u'\s[\u00ab\u00bb\u2013\u2014|-]\s',
                            reverse_title,
                            flags=re.UNICODE)

        # only trim if it won't take off over half the title
        if to_trim and to_trim.end() < len(title) / 2:
            title = title[:-(to_trim.end())]

    if not title:
        return

    # get rid of extraneous whitespace in the title
    title = re.sub(r'\s+', ' ', title, flags=re.UNICODE)

    return title.encode('utf-8').strip()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...