<Python, BeautifulSoup> 正規表現でマッチ

BeautifulSoupでタグtagを検索する時、正規表現regexpする方法。

こういうxmlデータがあったとき。

In [37]: s = '''
    ...: <data>
    ...: <aaa>1</aaa>
    ...: <bbb>2</bbb>
    ...: <c55>3</c55>
    ...: </data>
    ...: '''

スープして、

In [38]: from bs4 import BeautifulSoup

In [39]: soup = BeautifulSoup(s, 'xml')

In [40]: soup
Out[40]: 
<?xml version="1.0" encoding="utf-8"?>
<data>
<aaa>1</aaa>
<bbb>2</bbb>
<c55>3</c55>
</data>

findして、

In [41]: soup.find('data')
Out[41]: 
<data>
<aaa>1</aaa>
<bbb>2</bbb>
<c55>3</c55>
</data>

検索。

In [42]: soup.find('data').findAll('aaa')
Out[42]: [<aaa>1</aaa>]

In [43]: soup.find('data').find('aa')
[]

In [44]: soup.find('data').find('.*')
[]

正規表現が効いていない。。。
なので、reを呼び出して、compile

In [45]: import re

In [50]: soup.find('data').findAll(re.compile('[a-z]'))
Out[50]: [<aaa>1</aaa>, <bbb>2</bbb>, <c55>3</c55>]

In [51]: soup.find('data').findAll(re.compile('[a-z]{3}'))
Out[51]: [<aaa>1</aaa>, <bbb>2</bbb>]

In [52]: soup.find('data').findAll(re.compile('.*'))
Out[52]: [<aaa>1</aaa>, <bbb>2</bbb>, <c55>3</c55>]

いけるねー!

参考。

Life is very easy with Python: Beautiful Soup find_all() search API