Уведомления

Группа в Telegram: @pythonsu

#1 Ноя. 7, 2009 19:25:04

офян
От:
Зарегистрирован: 2009-11-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

Есть html-код вида

<tr>
<td class="row"><p><a href="?keyword=123">123</a></p></td>
<td class="row"><p>52</p></td>
<td class="row"><a href="http://www.google.com/search?123" target="_blank">35</a></td>
<td class="row"><a href="http://search.yahoo.com/search?fr=ytff-&p=123" target="_blank">19</a></td>
<td class="row"><a href="http://search.msn.com/results.aspx?q=123&FORM=MSNH&srch_type=0" target="_blank">8</a></td>
<tr>
<tr>
<td class="row"><p><a href="?keyword=456">456</a></p></td>
<td class="row"><p>52</p></td>
<td class="row"><a href="http://www.google.com/search?456" target="_blank">35</a></td>
<td class="row"><a href="http://search.yahoo.com/search?fr=ytff-&p=456" target="_blank">19</a></td>
<td class="row"><a href="http://search.msn.com/results.aspx?q=456&FORM=MSNH&srch_type=0" target="_blank">8</a></td>
<tr>
...
По сути это обычная таблица…
Следующими регулярными выражения пытаюсь найти значения в этих таблицах
'<a href=\"\?keyword\=.*?>(.*?)</a>'
'</a></p></td>.*?<td class=\".*?row\"><p>(\d*?)</p></td>'
'<td class=\".*?row\"><a href=\"http\:\/\/www\.google\.com/search\?q\=.*?>(.*?)</a></td>'
'<td class=\".*?row\"><a href=\"http\:\/\/search\.yahoo\.com/search\?fr\=ytff-.*?>(.*?)</a></td>'
'<td class=\".*?row\"><a href=\"http\:\/\/search\.msn\.com/results\.aspx\?q\=.*?>(.*?)</a></td>'
по отдельности данные регулярные выражения хорошо находятся findall'ом…
123
456
...
для первого…
52
52
...
для второго…
и так далее…

Но хотелось бы объеденить все в группы и выводить все вместе…
('123', ‘52’, ‘35’, ‘19’, ‘8’)
('456', ‘52’, ‘35’, ‘19’, ‘8’)

Как лучше всего это сделать и распарсить html…?



Офлайн

#2 Ноя. 7, 2009 20:47:02

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

А не хочешь воспользоваться модулями, реализующими удобный парсинг хтмл?



Офлайн

#3 Ноя. 7, 2009 21:10:54

офян
От:
Зарегистрирован: 2009-11-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

BeautifulSoup???

Я просто не совсем понимаю как он работает… там можно группой выводить?… или полностью таблицу спарсить?



Отредактировано (Ноя. 7, 2009 21:11:15)

Офлайн

#4 Ноя. 7, 2009 21:54:31

Ed
От:
Зарегистрирован: 2008-12-13
Сообщения: 1032
Репутация: +  13  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

офян
Но хотелось бы объеденить все в группы и выводить все вместе…
('123', ‘52’, ‘35’, ‘19’, ‘8’)
('456', ‘52’, ‘35’, ‘19’, ‘8’)
Можно объединить средствами Python, точнее zip.

Можно паттерны объединить в один, разделяя их ‘|’, тогда re.findall вернет вам нечто типа:


А можно, как уже тут посоветовали, поюзать какой-нибудь парсер.



Офлайн

#5 Ноя. 7, 2009 22:26:04

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

Документация у него так себе. Лучше бы нормально все классы описали. Можно сделать так:

soup = BeautifulSoup(html)
print soup.findAll("td", {"class": "row"}, text=re.compile("\d"))
это если у тебя только цифры в ячейках



Офлайн

#6 Ноя. 7, 2009 22:30:09

офян
От:
Зарегистрирован: 2009-11-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

нет… это полноценная таблица, в которой могут быть и цифры и буквы… причем со структурой, как указано выше…



Офлайн

#7 Ноя. 7, 2009 22:45:40

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

Тогда меняешь \d на то, что тебе угодно по правилам регулярных выражений. Правда в моем примере все в один список пихается, не совсем, как ты написал.



Офлайн

#8 Ноя. 8, 2009 02:32:54

офян
От:
Зарегистрирован: 2009-11-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

все вроде бы с супом ничего, если б не запутанная html… на ее разбор секунд 5-10 уходит (((( и 100% процессорного времени… обычными регулярными выражениями практически моментально…

есть еще идеи?



Отредактировано (Ноя. 8, 2009 02:33:10)

Офлайн

#9 Ноя. 8, 2009 03:17:25

pasaranax
От:
Зарегистрирован: 2009-06-13
Сообщения: 574
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

Как-то так:

content = []
for tr in re.findall("<tr>(.+?)</tr>", html, re.S):
content.append([])
for text in re.findall(">([\w\d]+?)<", tr):
content[-1].append(text)
print content
Тут еще надо поработать над (+?), для данного случая подходит, но я не знаю, что у тебя там в реале может быть. Да и вообще, хорошо бы на весь код страницы посмотреть, чтобы лишнего не нахватать.

Странно, что у тебя суп так медленно работает, я задержек не замечал. Он, по идее, на тех же регулярках должен быть основан, но надежнее, чем вручную.



Отредактировано (Ноя. 8, 2009 03:19:18)

Офлайн

#10 Ноя. 8, 2009 03:26:50

офян
От:
Зарегистрирован: 2009-11-06
Сообщения: 8
Репутация: +  0  -
Профиль   Отправить e-mail  

Парсинг, группы и регулярные выражения...

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version