Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/47: Рейтинг темы: голосов - 47, средняя оценка - 4.72
 Аватар для bogdan_017
21 / 21 / 19
Регистрация: 18.03.2014
Сообщений: 148

Регулярные выражения. Парсинг html

12.11.2015, 00:25. Показов 8938. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уважаемые форумчане!

Есть задача вытащить ссылки из html-файла. Первая мысль: "Регулярные выражения, настало ваше время". До этого момента с ними не сталкивался. Решил разобраться. Вот пробую по гугловским статьям. В итоге по задаче:

- есть html-код (в моем случае такой):
Кликните здесь для просмотра всего текста
HTML5
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
<!doctype html>
<html>
<head>
    <title>Example Domain</title>
 
    <meta charset="utf-8" />
    <meta http-equiv="Content-type" content="text/html; charset=utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1" />
    <style type="text/css">
    body {
        background-color: #f0f0f2;
        margin: 0;
        padding: 0;
        font-family: "Open Sans", "Helvetica Neue", Helvetica, Arial, sans-serif;
        
    }
    div {
        width: 600px;
        margin: 5em auto;
        padding: 50px;
        background-color: #fff;
        border-radius: 1em;
    }
    a:link, a:visited {
        color: #38488f;
        text-decoration: none;
    }
    @media (max-width: 700px) {
        body {
            background-color: #fff;
        }
        div {
            width: auto;
            margin: 0 auto;
            border-radius: 0;
            padding: 1em;
        }
    }
    </style>    
</head>
 
<body>
<div>
    <h1>Example Domain</h1>
    <p>This domain is established to be used for illustrative examples in documents. You may use this
    domain in examples without prior coordination or asking for permission.</p>
    <p><a href="http://www.iana.org/domains/example">More information...</a></p>
</div>
</body>
</html>

- написал такое регулярное выражение:
Python
1
2
3
4
#reg ex
pattern = '<a href="\S*">'
result = re.findall(pattern, string) # string - считанный код HTML
print (result)
Вроде все хорошо, но в результате получаю ссылку (она одна, для тех, кто не глядел в html) вместе с "служебной информацией" <a href ="...">, а по задаче нужно получить именно ссылки. Это конечно можно реализовать функциями для работы с обычными строками (обрезать куски до и после кавычек), но хотелось бы узнать, как получить такой результат регулярными выражениями.

Заранее благодарю
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
12.11.2015, 00:25
Ответы с готовыми решениями:

Регулярные выражения
Подскажите как найти в строке последовательность символов: &quot;nanananana&quot;. Мне нужна исключительно такая последовательность, то есть мне...

Регулярные выражения
Всем здравствуйте. Помогите решить проблему. Есть текстовый файл, в нем мне нужно отобрать среди списка вот такой структуры: 10....

Регулярные выражения
Читал статью на хабре про регулярные выражение и не могу понять одну вещь, обьясните на пальцах. Цитирую: &quot;Скажем, вы хотите...

4
2742 / 2341 / 620
Регистрация: 19.03.2012
Сообщений: 8,830
12.11.2015, 01:47
Лучший ответ Сообщение было отмечено bogdan_017 как решение

Решение

bogdan_017, Как сказал один умный человек:
У вас есть проблема. Вы решили использовать регулярные выражения чтобы её решить. Теперь у вас две проблемы.
Применять регулярки для парсингда html, это оочень плохая идея, для этих целей есть специальные модули, вроде lxml.html и т д


Вообще вытащить вот так можно, но тут на пример не учтен вариант, что ссылка может заключаться не только в двойные кавычки, но ещё и в одинарные
Python
1
res = re.findall('href="(\S*)"', html)
таким моментов куча и по этому регулярки это инструмент, которым нужно пользоваться с умом.
2
12.11.2015, 05:03

Не по теме:

Цитата Сообщение от bogdan_017 Посмотреть сообщение
Есть задача вытащить ссылки из html-файла. Первая мысль: "Регулярные выражения, настало ваше время"
You can't parse [X]HTML with regex.

0
12.11.2015, 13:41  [ТС]

Не по теме:

0x10, а человек с юморком попался :)

 Комментарий модератора 
Пока предупреждаю за офф
0
║XLR8║
 Аватар для outoftime
1212 / 909 / 270
Регистрация: 25.07.2009
Сообщений: 4,360
Записей в блоге: 5
12.11.2015, 14:07
bogdan_017, Если документ содержит шаблоны underscore.js то тебе еще надо обернуть в регулярку в проверку нету ли script тега, а если еще что-то будет... Словом лучше для парсинга html не использовать regex. Их используют только где производительность очень очень надо (мол проход за линию и т.д. в отличии от разного рода DOM парсеров).

Проще всего использовать BeautifulSoup: https://github.com/koutoftimer... oxy.py#L72
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2015, 14:07
Помогаю со студенческими работами здесь

Регулярные выражения
Здравствуйте. Нужно написать регулярное выражение одной строкой для ссылки, в которой после http:// не может быть символов /. Пример...

Регулярные выражения
Напишите пожалуйста код для решения задачи У Софии был очень напряженный месяц и она решила взять отпуск на неделю. Чтобы избежать...

Регулярные выражения
1. как с помощью регулярных выражений вытащить текст из тегов &lt;td&gt;&lt;/td&gt;: &lt;td&gt;text1&lt;/td&gt; 2. После редактирования и вернуть назад: ...

регулярные выражения
подскажите пожалуйста, можно-ли с помощью спецсимволов найти слова в строке, в которых данный символ встречается определенное количество...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru