Как найти ссылки со всем заглавным текстом, используя Python (без стороннего парсера)? - PullRequest
0 голосов
/ 04 ноября 2010

Я использую BeautifulSoup в простой функции для извлечения ссылок, которые имеют весь заглавный текст:

def findAllCapsUrls(page_contents):
    """ given HTML, returns a list of URLs that have ALL CAPS text
    """
    soup = BeautifulSoup.BeautifulSoup(page_contents)
    all_urls = node_with_links.findAll(name='a')

    # if the text for the link is ALL CAPS then add the link to good_urls
    good_urls = []
    for url in all_urls:
        text = url.find(text=True)
        if text.upper() == text:
            good_urls.append(url['href'])

    return good_urls

Работает хорошо в большинстве случаев, но несколько страниц не будут правильно анализироваться в BeautifulSoup (или lxml, который я тоже пробовал) из-за некорректного HTML на странице, что приводит к объекту без (или только некоторых) ссылок в этом. «Горстка» может звучать как не большое дело, но эта функция используется в сканере, поэтому может быть сотни страниц, которые сканер никогда не найдет ...

Как можно реорганизовать вышеуказанную функцию, чтобы она не использовала такой парсер, как BeautifulSoup? Я искал, как это сделать с помощью регулярных выражений, но во всех ответах говорится «используйте BeautifulSoup». В качестве альтернативы я начал смотреть, как «исправить» искаженный HTML-код, чтобы он выполнялся синтаксическим анализом, но я не думаю, что это лучший путь ...

Какое альтернативное решение, использующее re или что-то еще, может сделать то же самое, что и функция выше?

Ответы [ 3 ]

3 голосов
/ 04 ноября 2010

Если html-страницы искажены, не так много решений, которые действительно могут вам помочь. BeautifulSoup или другая библиотека синтаксического анализа - это способ разбирать HTML-файлы.

Если вы хотите избежать пути к библиотеке, вы можете использовать регулярное выражение для сопоставления всех ваших ссылок, см. регулярное выражение для извлечения-url-from-an-html-ссылка с использованием диапазона [AZ]

1 голос
/ 04 ноября 2010

Когда мне нужно разобрать действительно неработающий HTML и скорость не является самым важным фактором, я автоматизирую браузер с помощью selenium & webdriver .

Это самый устойчивый способ разбора html, который я знаю. Проверьте этот учебник он показывает, как извлечь предложение Google с помощью веб-драйвера (код написан на Java, но его можно изменить на Python).

0 голосов
/ 04 ноября 2010

Я получил комбинацию regex и BeautifulSoup:

def findAllCapsUrls2(page_contents):
    """ returns a list of URLs that have ALL CAPS text, given
    the HTML from a page. Uses a combo of RE and BeautifulSoup
    to handle malformed pages.
    """
    # get all anchors on page using regex
    p = r'<a\s+href\s*=\s*"([^"]*)"[^>]*>(.*?(?=</a>))</a>'
    re_urls = re.compile(p, re.DOTALL)
    all_a = re_urls.findall(page_contents)

    # if the text for the anchor is ALL CAPS then add the link to good_urls
    good_urls = []
    for a in all_a:
        href = a[0]
        a_content = a[1]
        a_soup = BeautifulSoup.BeautifulSoup(a_content)
        text = ''.join([s.strip() for s in a_soup.findAll(text=True) if s])
        if text and text.upper() == text:
            good_urls.append(href)

    return good_urls

Пока это работает для моих сценариев использования, но я не гарантирую, что это сработает на всех страницах.Кроме того, я использую эту функцию только в случае сбоя оригинальной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...