python soup.find_Beautifulsoup:find()和.select()之间有区别吗-python 3.xx

总结评论:选择查找多个实例并返回一个列表,查找查找第一个实例,因此它们不会执行相同的操作。选择一个将等同于查找。

我几乎总是在链接标记或使用tag.classname时使用css选择器,如果查找没有使用find类的单个元素。从本质上讲,这取决于用例和个人偏好。

就灵活性而言,我认为您知道答案,soup.select("div[id=foo] > div > div > div[class=fee] > span > span > a")使用多个链式的find/find-all调用看起来很难看。

bs4中css选择器的唯一问题是支持非常有限,nth类型的是唯一实现的伪类,并且不支持链接属性,如a[hrf][src],css选择器的许多其他部分也是如此。但是像a[hrf=..]*,a[hrf^=],a[hrf$=]等等。。我是否认为比find("a", href=re.compile(....))好得多,但这也是个人偏好。

为了提高性能,我们可以运行一些测试,我修改了在800多个html文件上运行的answer here的代码,这些文件来自here,并不详尽,但应该提供一些选项的可读性和性能的线索:

修改后的函数为:from bs4 import BeautifulSoup

from glob import iglob

def parse_find(soup):

author = soup.find("h4", class_="h12 talk-link__speaker").text

title = soup.find("h4", class_="h9 m5").text

date = soup.find("span", class_="meta__val").text.strip()

soup.find("footer",class_="footer").find_previous("data", {

"class": "talk-transcript__para__time"}).text.split(":")

soup.find_all("span",class_="talk-transcript__fragment")

def parse_select(soup):

author = soup.select_one("h4.h12.talk-link__speaker").text

title = soup.select_one("h4.h9.m5").text

date = soup.select_one("span.meta__val").text.strip()

soup.select_one("footer.footer").find_previous("data", {

"class": "talk-transcript__para__time"}).text

soup.select("span.talk-transcript__fragment")

def test(patt, func):

for html in iglob(patt):

with open(html) as f:

func(BeautifulSoup(f, "lxml")

现在开始计时:In [7]: from testing import test, parse_find, parse_select

In [8]: timeit test("./talks/*.html",parse_find)

1 loops, best of 3: 51.9 s per loop

In [9]: timeit test("./talks/*.html",parse_select)

1 loops, best of 3: 32.7 s per loop

就像我所说的不详尽,但我想我们可以放心地说css选择器确实更有效。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值