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

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

12.11.2015, 00:25. Показов 8899. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru