像CSS选择器一样用BeautifulSoup
较早前写扒虫多,虽然BeautifulSoup很 好用,但厌倦每次都要手动去编写复杂的Dom元素定位语句,突然想,能不能像CSS选择器一样,只给一个表达式就返回我想要的东西?后来在网上找了下没找 着,想了想工作量也不大就自己实现了一个,目前支持ID,Class,标签及属性选择器、支持 space、 >、 + 操作符,基本上已满足大部份定位需求。
代码见附件里的BTSelector.py,另附UnitTest。
常见使用方式是:
注意,本脚本依赖于BeautifulSoup,所以,使用之前请确保你已经安装了。
python 代码
- from BTSelector import findAll
- soup = BeautifulSoup(htmlContent)
- nodes = findAll('div.navigator #notice',soup)
- # findAll返回的是符合选择条件的Dom 对象列表,实际上是BeautifulSoup的标签或字符类。
用testCase作为使用示例:
一、上一个复杂一点的用例:
python 代码
- def testMixSelection(self):
- target = "#header > div#name > a.highlight"
- html = '''
- <div id="header">
- <div id="name">
- <a>test</a>
- <a>right</a>
- <a>ok</a>
- </div>
- <div id="your">
- </div>
- </div>
- <div id="body">fk
- </div>
- '''
- soup = BeautifulSoup(html)
- ret = findAll(target,soup)
- self.assertEqual(2,len(ret))
二、再上一个使用位置操作符的用例:
python 代码
- def testPosition(self):
- target = "h2 + ul > li > a"
- html = '''
- <h2>title</h2>
- <ul>
- <li><a href="#">nothing</a></li>
- <li><a href="#">ok</a></li>
- <li><a href="#">come on!</a></li>
- </ul>
- '''
- soup = BeautifulSoup(html)
- ret = findAll(target,soup)
- self.assertEqual(3,len(ret))
更多的见附件的Unittest。希望大家喜欢。
编程
jeff
0
python