Для регулярных выражений Python требуется шаблон с фиксированной шириной - PullRequest
8 голосов
/ 10 апреля 2010

При попытке извлечь заголовок html-страницы я всегда использовал следующее регулярное выражение:

(?<=<title.*>)([\s\S]*)(?=</title>)

Который будет извлекать все между тегами в документе и игнорировать сами теги. Однако при попытке использовать это регулярное выражение в Python возникает следующее исключение:

Traceback (most recent call last):  
File "test.py", line 21, in <module>
    pattern = re.compile('(?<=<title.*>)([\s\S]*)(?=</title>)')
File "C:\Python31\lib\re.py", line 205, in compile
    return _compile(pattern, flags)   
File "C:\Python31\lib\re.py", line 273, in _compile
    p = sre_compile.compile(pattern, flags)   File
"C:\Python31\lib\sre_compile.py", line 495, in compile
    code = _code(p, flags)   File "C:\Python31\lib\sre_compile.py", line 480, in _code
_compile(code, p.data, flags)   File "C:\Python31\lib\sre_compile.py", line 115, in _compile
    raise error("look-behind requires fixed-width pattern")
sre_constants.error: look-behind requires fixed-width pattern

Код, который я использую:

pattern = re.compile('(?<=<title.*>)([\s\S]*)(?=</title>)')
m = pattern.search(f)

если я сделаю некоторые минимальные корректировки, это сработает:

pattern = re.compile('(?<=<title>)([\s\S]*)(?=</title>)')
m = pattern.search(f)

Это, однако, не будет учитывать потенциальные заголовки HTML, которые по какой-либо причине имеют атрибуты или аналогичные.

Кто-нибудь знает хороший обходной путь для этой проблемы? Любые советы приветствуются.

Ответы [ 5 ]

11 голосов
/ 10 апреля 2010

Откажитесь от идеи разбора HTML с помощью регулярных выражений и используйте вместо этого настоящую библиотеку для разбора HTML. После быстрого поиска я нашел этот . Это гораздо более безопасный способ извлечения информации из файла HTML.

Помните, что HTML не является обычным языком, поэтому регулярные выражения в корне неверны для извлечения информации из него.

5 голосов
/ 10 апреля 2010

Вот знаменитый ответ о разборе html с регулярными выражениями, который отлично справляется с высказыванием: «Не используйте regex для разбора html».

3 голосов
/ 29 марта 2013

Регулярное выражение для извлечения содержимого не вложенных тегов HTML / XML на самом деле очень просто:

r = re.compile('<title[^>]*>(.*?)</title>')

Однако, для чего-то более сложного, вы должны действительно использовать правильный DOM-парсер, такой как urllib или BeautifulSoup.

2 голосов
/ 10 апреля 2010

Как насчет чего-то вроде:

 r = re.compile("(<title.*>)([\s\S]*)(</title>)")
 title = r.search(page).group(2)
1 голос
/ 10 апреля 2010

Если вы хотите получить тег заголовка,

html=urllib2.urlopen("http://somewhere").read()
for item in html.split("</title>"):
    if "<title>" in item:
        print item[ item.find("<title>")+7: ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...