2014-12-27 4 views
0

У меня есть HTML-страницу, которая выглядит как этотданные HTML Извлечение с использованием регулярных выражений

<tr> 
    <td align=left> 
     <a href="history/2c0b65635b3ac68a4d53b89521216d26.html"> 
      <img src="/images/page.gif" border="0" title="полная информация о документе" width=20 height=20> 
     </a> 
     <a href="history/2c0b65635b3ac68a4d53b89521216d26_0.html" title="C.">Th</a> 
    </td> 
</tr> 
<tr align=right> 
    <td align=left> 
     <a href="marketing/3c0a65635b2bc68b5c43b88421306c37.html"> 
      <img src="/images/page.gif" border="0" title="полная информация о документе" width=20 height=20> 
     </a> 
     <a href="marketing/3c0a65635b2bc68b5c43b88421306c37_0.html" title="b">aa</a> 
    </td> 
</tr> 

мне нужно, чтобы получить текст

история/2c0b65635b3ac68a4d53b89521216d26.html маркетинг/3c0a65635b2bc68b5c43b88421306c37.html

Я написал сценарий в python, который использует регулярные выражения

import re 
a = re.compile("[0-9 a-z]{0,15}/[0-9 a-f]{32}.html") 
print(a.match(s)) 

где s значение html-страница выше. Однако, когда я использую этот скрипт, я получаю "None". Где я неправ?

+0

Вместо регулярных выражений попытаться использовать BeautifulSoup. –

ответ

3

Don't use regex for parsing HTML content.

Используйте специализированный инструмент - в HTML Parser.

Пример (с использованием BeautifulSoup):

# -*- coding: utf-8 -*- 
from bs4 import BeautifulSoup 

data = u"""Your HTML here""" 

soup = BeautifulSoup(data) 
for link in soup.select('td a[href]'): 
    print link['href'] 

Печать:

history/2c0b65635b3ac68a4d53b89521216d26.html 
history/2c0b65635b3ac68a4d53b89521216d26_0.html 
marketing/3c0a65635b2bc68b5c43b88421306c37.html 
marketing/3c0a65635b2bc68b5c43b88421306c37_0.html 

Или, если вы хотите получить href значения, которые следуют образцу, использование:

import re 

for link in soup.find_all('a', href=re.compile(r'\w+/\w{32}\.html')): 
    print link['href'] 

где r'\w+/\w{32}\.html' является регулярным выражением, которое будет применяется к атрибуту href каждого найденного тега a. Он будет соответствовать одному или нескольким буквенно-цифровым символам (\w+), а затем косой чертой, за которой следует ровно 32 буквенно-цифровых символа (\w{32}), а затем точка (\. - необходимо экранировать), а затем html.

DEMO.

2

Вы также можете написать что-то вроде

>>> soup = BeautifulSoup(html) #html is the string containing the data to be parsed 
>>> for a in soup.select('a'): 
...  print a['href'] 
... 
history/2c0b65635b3ac68a4d53b89521216d26.html 
history/2c0b65635b3ac68a4d53b89521216d26_0.html 
marketing/3c0a65635b2bc68b5c43b88421306c37.html 
marketing/3c0a65635b2bc68b5c43b88421306c37_0.html 
Смежные вопросы