10

When trying to extract the title of a html-page I have always used the following regex:

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

Which will extract everything between the tags in a document and ignore the tags themselves. However, when trying to use this regex in Python it raises the following Exception:

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

The code I am using is:

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

if I do some minimal adjustments it works:

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

This will, however, not take into account potential html titles that for some reason have attributes or similar.

Anyone know a good workaround for this issue? Any tips are appreciated.

2
  • Is there some reason it has to be a zero-width assertion? Could you just use a non-capturing group? Commented Apr 10, 2010 at 11:47
  • 3
    Although you shouldn’t use regular expressions to process HTML. Why do you use look-arounds at all and not something like <title.*>([\s\S]*)</title> and take the match of the first group? Commented Apr 10, 2010 at 11:49

5 Answers 5

13

Toss out the idea of parsing HTML with regular expressions and use an actual HTML parsing library instead. After a quick search I found this one. It's a much safer way to extract information from an HTML file.

Remember, HTML is not a regular language so regular expressions are fundamentally the wrong tool for extracting information from it.

Sign up to request clarification or add additional context in comments.

1 Comment

BeautifulSoup (crummy.com/software/BeautifulSoup) is also a good option.
6

Here's a famous answer on parsing html with regular expressions that does a great job of saying, "don't use regex to parse html."

1 Comment

Yes and no. You shouldn't use regex to parse an entire DOM, or complicated nestings of tags. However, parsing a single non-nested tag, as the OP is trying to do, is a perfectly legitimate use of regex.
4

The regex for extracting the content of non-nested HTML/XML tags is actually very simple:

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

However, for anything more complex, you should really use a proper DOM parser like urllib or BeautifulSoup.

Comments

3

What about something like:

 r = re.compile("(<title.*>)([\s\S]*)(</title>)")
 title = r.search(page).group(2)

Comments

2

If you just want to get the title tag,

html=urllib2.urlopen("http://somewhere").read()
for item in html.split("</title>"):
    if "<title>" in item:
        print item[ item.find("<title>")+7: ]

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.