我正在使用BeautifulSoup从表中提取tabledata标签。 TD有一类“a”,“u”,“e”,“可用不可用”或“不可用”。 (是的,我知道古怪的班级名字,但是嘿......)
以下是一个例子:
<tr>
<td class="u">4</td>
<td class="unavailable-available">5</td>
<td class="a'>6</td>
<td class="available-unavailable">7</td>
<td class="u">8</td>
...
我一直在使用包含re.compile()的行:
tab = [int(tag.string) for tag in soup.find('table',{'summary':tableSummary}).findAll("td", attrs = {"class": re.compile('\Aa')})]
我需要提取所有td的类名为'a'和'unavailable-available'。我一直在尝试一些负面的前瞻性断言,但没有太多运气。我会重视能够产生正确正则表达式的任何正则表达式传说......
答案 0 :(得分:2)
table.findAll('td', attrs = {"class":re.compile(r'(^|\s)(a|unavailable-available)($|\s)')})
这匹配字符串或空格的开头,后跟“a”或“不可用”,后跟空格或字符串结尾。所以它会匹配所有这些东西
class="a"
class="a ui-xxx"
class="ui-xxx a"
class="ui-xxx a ui-yyy"
class="unavailable-available"
class="unavailable-available foo"
答案 1 :(得分:0)
HA!
re.compile('^a(?!vail)|^un')
答案 2 :(得分:0)
我向其他人的RE力量低头。但作为BS + RE的另一个数据点,这里是一个pyparsing的再现(假设那些令人讨厌的不匹配的引号得到修复):
html = """
<tr>
<td class="u">4</td>
<td class="unavailable-available">5</td>
<td class="a">6</td>
<td class="available-unavailable">7</td>
<td class="u">8</td>
"""
from pyparsing import makeHTMLTags, withAttribute, oneOf, SkipTo
# define opening and closing tag expressions
td,tdEnd = makeHTMLTags("TD")
# only want opening TD's with certain classes
td.setParseAction(withAttribute(**{'class':oneOf("a unavailable-available")}))
# define overall pattern
patt = td + SkipTo(tdEnd)("contents") + tdEnd
# search for matches
for t in patt.searchString(html):
print t.dump()
打印:
['TD', ['class', 'unavailable-available'], False, '5', '</TD>']
- class: unavailable-available
- contents: 5
- empty: False
- endTd: </TD>
- startTd: ['TD', ['class', 'unavailable-available'], False]
- class: unavailable-available
- empty: False
['TD', ['class', 'a'], False, '6', '</TD>']
- class: a
- contents: 6
- empty: False
- endTd: </TD>
- startTd: ['TD', ['class', 'a'], False]
- class: a
- empty: False
对于每个匹配,您还可以直接访问t.contents
和t['class']
(必须使用dict语法,因为class
是Python关键字)。