шаблон регулярных выражений в python для разбора тегов заголовков HTML

Я учусь, чтобы использовать re и urllib модуль в Python и пытаюсь написать простой парсер. Вот код, который я написал, чтобы очистить только название веб-сайтов:

#!/usr/bin/python

import urllib
import re

urls=["http://google.com","https://facebook.com","http://reddit.com"]

i=0

these_regex="<title>(.+?)</title>"
pattern=re.compile(these_regex)

while(i<len(urls)):
        htmlfile=urllib.urlopen(urls[i])
        htmltext=htmlfile.read()
        titles=re.findall(pattern,htmltext)
        print titles
        i+=1

это дает правильный вывод для Google и Reddit, но не для Facebook-Как так:

['Google']
[]
['reddit: the front page of the internet']

это потому, что я обнаружил, что на странице Facebook title тег следующим образом: <title id="pageTitle">. Разместить для дополнительного id=, Я изменил these_regex переменной следующим образом: these_regex="<title.+?>(.+?)</title>". Но это дает следующий результат:

[]
['Welcome to Facebook xe2x80x94 Log in, sign up or learn more']
[]

как бы я объединил оба, чтобы я мог учитывать любые дополнительные параметры, переданные в title тег?

3 ответов


вы используете регулярное выражение, и сопоставление HTML с такими выражениями становится слишком сложным, слишком быстрым.

вместо этого используйте парсер HTML, Python имеет несколько вариантов на выбор. Я рекомендую вам использовать BeautifulSoup, популярная библиотека 3rd party.

BeautifulSoup пример:

from bs4 import BeautifulSoup

response = urllib2.urlopen(url)
soup = BeautifulSoup(response.read(), from_encoding=response.info().getparam('charset'))
title = soup.find('title').text

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

ваша конкретная проблема может быть решена путем сопоставления дополнительных символов в элементе title тег, дополнительно:

r'<title[^>]*>([^<]+)</title>'

это соответствует 0 или более символам,не закрывающим тегом > кронштейн. "0 или более" здесь позволяет сопоставлять как дополнительные атрибуты, так и простые <title> тег.


рекомендуется использовать Красивый Суп или любой другой парсер для разбора HTML, но если вы очень хочу regex следующий фрагмент кода сделает эту работу.

код регулярного выражения:

<title.*?>(.+?)</title>

как работает:

Regular expression visualization

выдает:

['Google']
['Welcome to Facebook - Log In, Sign Up or Learn More']
['reddit: the front page of the internet']

Если вы хотите идентифицировать все теги htlm, вы можете использовать это

batRegex = re.compile(r'(<[a-z]*>)')
m1=batRegex.search(html)
print batRegex.findall(yourstring)