像CSS选择器一样使用BeautifulSoup
jeff jie <[email protected]> reply-to [email protected] to [email protected], [email protected] date Tue, Jun 16, 2009 at 11:04
subject [ZPyUG:1030] [http://groups.google.com/group/python-cn/browse_thread/thread/c77b833c0f21eb3b 像CSS选择器一样使用BeautifulSoup - python-cnCPyUG华蟒用户组(中文Py用户组) | Google 网上论坛]
共享一些代码片段,一直说要共享,一搁就大半年。。哎。。
较早前写扒虫多,虽然BeautifulSoup很好用,但厌倦每次都要手动去编写复杂的Dom元素定位语句,突然想,能不能像CSS选择器一样,只给一个表达式就返回我想要的东西?后来在网上找了下没找着,想了想工作量也不大就自己实现了一个,目前支持ID,Class,标签及属性选择器、支持 space、 >、 + 操作符,基本上已满足大部份定位需求。
代码见附件的BTSelector.py,另附UnitTest。
分享在: http://code.google.com/p/zqlib/source/browse/tangle/BTSelector/
常见使用方式是:
注意,本脚本依赖于BeautifulSoup,所以,使用之前请确保你已经安装了。
除了使用findAll函数,还可以直接使用findById,findByTag等函数,等有兴趣的同学看源代码来发现了。
用testCase作为使用示例:
一、上一个复杂一点的用例:
1 def testMixSelection(self):
2 target = "#header > div#name > a.highlight"
3 html = '''
4 <div id="header">
5 <div id="name">
6 <a class="target">test</a>
7 <a class="highlight">right</a>
8 <a class="highlight">ok</a>
9 </div>
10 <div id="your">
11 </div>
12 </div>
13 <div id="body">fk
14 </div>
15 '''
16 soup = BeautifulSoup(html)
17
18 ret = findAll(target,soup)
19
20 self.assertEqual(2,len(ret))
二、再上一个使用位置操作符的用例:
1 def testPosition(self):
2
3 target = "h2 + ul > li > a"
4
5 html = '''
6
7 <h2>title</h2>
8
9 <ul>
10
11 <li><a href="#">nothing</a></li>
12
13 <li><a href="#">ok</a></li>
14
15 <li><a href="#">come on!</a></li>
16
17 </ul>
18
19 '''
20
21 soup = BeautifulSoup(html)
22
23 ret = findAll(target,soup)
24
25 self.assertEqual(3,len(ret))
更多的见附件的Unittest。里面没太多技术含量的东西,但希望大家喜欢。
pyquery
金浩 <[email protected]> reply-to [email protected] to [email protected] date Tue, Jun 16, 2009 at 11:10 subject [CPyUG:89577] Re: 像CSS选择器一样使用BeautifulSoup
其实,这个东西类似应该已经有了。比如pyquery http://pyquery.org/
另外听很多人说 BeautifulSoup 效率非常差。
反馈
创建 by -- ZoomQuiet [DateTime(2009-06-16T06:50:24Z)]