Как извлечь URL страницы Facebook из тега HTML <a>, используя Regex в Python? - PullRequest
2 голосов
/ 25 апреля 2019

Я собираю несколько сайтов для извлечения URL-адресов страниц Facebook в Python 3 с помощью Beautiful Soup. Я заинтересован в том, чтобы извлечь только один URL-адрес для каждого веб-сайта, который перенаправляется в профиль страницы Facebook, но не является типом общего ресурса.

По этой причине я пытаюсь использовать регулярное выражение для извлечения URL-адресов из атрибута href в тегах <a>. С помощью Beautiful Soup я извлекаю первый тег <a> для каждого веб-сайта, фильтруя по значению атрибута href, содержащего URL-адрес страницы Facebook.

Мой код следующий:

# coding=utf-8
from bs4 import BeautifulSoup
import requests
import re


def makeSoup(website):
    if 'http' in website:
        page = requests.get(website)
    else:
        page = requests.get('http://' + website)
    soup = BeautifulSoup(page.content, 'html.parser')
    page.close()
    return soup


def facebookProfileScraper(soup):
    link = soup.find('a', {'href': re.compile("https?://(www\\.)?facebook\\.com/[^(share)]?(\\w+\\.?)+")})
    if link is None:
        return "NaN"
    return link['href'] 

Ниже приведены примеры тегов <a>, из которых я хотел бы извлечь URL-адреса (я ставлю цифры, чтобы идентифицировать каждый веб-сайт также для результатов, которые я получил при моих попытках):

1. <a class="rss fb" href="http://www.facebook.com/gironafc" target="_blank">Facebook</a>
2. <a href="https://www.facebook.com/waterworld.parcaquatic" target="_blank"><i class="fa fa-facebook"></i></a>
3. <a class="social facebook" target="_blank" href="https://www.facebook.com/aquabrava"><span class="fa fa-facebook"></span></a>
4. <a href="https://www.facebook.com/UEO1921" target="_blank"><img alt="Facebook" height="32" src="http://www.ueolot.com/wp-content/themes/realsoccer/images/light/social-icon/facebook.png" width="32"/>
</a>
5. <a href="https://www.facebook.com/Roc%C3%B2drom-Girona-187271461378780/">Facebook</a>
6. <a class="fb_share" href="https://www.facebook.com/pages/Skydive-Empuriabrava/44214266003?fref=ts" target="_blank"></a>

Первая попытка

https?://(www\\.)?facebook\\.com/[^(share)]?(\\w+\\.?)+

Но я получил эти </a> теги:

1. <a href="http://facebook.com/share.php?src=bm&amp;v=3&amp;u=" target="_blank"><span class="fa fa-facebook"></span></a>
2. <a href="https://www.facebook.com/waterworld.parcaquatic" target="_blank"><i class="fa fa-facebook"></i></a>
3. <a class="social facebook" href="https://www.facebook.com/aquabrava" target="_blank"><span class="fa fa-facebook"></span></a>
4. <a href="https://www.facebook.com/UEO1921" target="_blank"><img alt="Facebook" height="32" src="http://www.ueolot.com/wp-content/themes/realsoccer/images/light/social-icon/facebook.png" width="32"/>
</a>
5. <a href="https://www.facebook.com/Roc%C3%B2drom-Girona-187271461378780/">Facebook</a>
6. <a class="fb_share" href="https://www.facebook.com/pages/Skydive-Empuriabrava/44214266003?fref=ts" target="_blank"></a>

С веб-сайта 1. Я получил неправильный тег <a>.

Вторая попытка

https?://(www\\.)?facebook\\.com/[^(share)](\\w+\\.?)+

Я пытался удалить ? после [^share], но получил следующие теги:

1. <a class="rss fb" href="http://www.facebook.com/gironafc" target="_blank">Facebook</a>
2. <a href="https://www.facebook.com/waterworld.parcaquatic" target="_blank"><i class="fa fa-facebook"></i></a>
3. None
4. <a href="https://www.facebook.com/UEO1921" target="_blank"><img alt="Facebook" height="32" src="http://www.ueolot.com/wp-content/themes/realsoccer/images/light/social-icon/facebook.png" width="32"/>
</a>
5. <a href="https://www.facebook.com/Roc%C3%B2drom-Girona-187271461378780/">Facebook</a>
6.<a class="fb_share" href="https://www.facebook.com/pages/Skydive-Empuriabrava/44214266003?fref=ts" target="_blank"></a>

с веб-сайта 3. Я не извлекаю тег <a>, поскольку с помощью [^(share)] я отменяю любой URL с помощью a (или любого из s, h, r, e ) после http://www.facebook.com/.

Третья попытка

https?://(www\\.)?facebook\\.com/(\\w+\\.?)+

Я попытался удалить [^share], но полученные теги были такими же, как и с первой попытки, поэтому я тоже получил URL типа общего ресурса.

Как выбрать только теги a, которые не имеют URL-адреса Facebook общего типа, в качестве значения href?

Ответы [ 3 ]

2 голосов
/ 25 апреля 2019
def foo(url):
    l = []
    soup = BeautifulSoup(requests.get(url).text, "html.parser")
    links = soup.find_all("a")
    for link in links:
        if not "share" in link.get("href").lower():
            l.append(link)
    return l

Эта функция проверяет наличие share в ссылках и возвращает ссылки без share.

1 голос
/ 25 апреля 2019

Я нашел решение, улучшив регулярное выражение. Этот вопрос мне очень помог.Вот регулярное выражение для моего случая:

https?://(www\.)?facebook\.com/(?!share\.php).(\S+\.?)+

Соответствует всем тегам <a> с URL-адресом страницы Facebook как href значение.

С регулярным выражением (?!anywordorexpression). это будетНе может быть извлечено ни одной строки, содержащей подстроку anywordorexpression.

0 голосов
/ 25 апреля 2019

Вы можете использовать более эффективные селекторы атрибутов css с псевдоклассом: not и: includes, используя bs4 4.7.1

links = [item['href'] for item in soup.select("[href^='https://www.facebook.com/']:not(:contains(share))")]

Только для первой ссылки

link = soup.select_one("[href^='https://www.facebook.com/']:not(:contains(share))")['href']
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...