шаблон регулярных выражений в 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>
как работает:
выдает:
['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)