Python 美化组:.find()和.select()之间的区别
当您使用刮取网站的某个部分时,您可以使用Python 美化组:.find()和.select()之间的区别,python,python-3.x,beautifulsoup,Python,Python 3.x,Beautifulsoup,当您使用刮取网站的某个部分时,您可以使用 soup.find()和soup.findAll()或 汤。选择() .find()和.select()方法之间有区别吗? (例如在性能或灵活性等方面)或它们是否相同?总结评论: select查找多个实例并返回一个列表,而find查找第一个实例,因此它们不会执行相同的操作。选择一个将是要查找的等效项 在链接标记或使用tag.classname时,如果要查找没有使用find类的单个元素,我几乎总是使用css选择器。从本质上讲,这取决于用例和个人偏好
和soup.find()
或soup.findAll()
汤。选择()
.find()
和.select()
方法之间有区别吗?
(例如在性能或灵活性等方面)或它们是否相同?总结评论:
- select查找多个实例并返回一个列表,而find查找第一个实例,因此它们不会执行相同的操作。选择一个将是要查找的等效项李>
- 在链接标记或使用tag.classname时,如果要查找没有使用find类的单个元素,我几乎总是使用css选择器。从本质上讲,这取决于用例和个人偏好
- 就灵活性而言,我想你知道答案,
使用多链find/find\u all调用看起来很难看soup.select(“div[id=foo]>div>div>div[class=fee]>span>a”)
- bs4中css选择器的唯一问题是支持非常有限,第n个类型是唯一实现的伪类,像[href][src]这样的链接属性也不受支持,css选择器的许多其他部分也不受支持。但是像a[href=…]*、a[href^=]、a[href$=]等。。我认为这比
好得多,但这也是我个人的偏好find(“a”,href=re.compile(..)
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选择器肯定更有效
select()
接受CSS选择器,find()
看不到,但我真的不明白它们之间的区别。因为对我来说,他们可以做同样的事情。我想知道两者的区别。(实际上,我对.select()有一个小的偏好)select查找多个实例并返回一个列表,find查找第一个实例,因此它们不会执行相同的操作select_one
将等同于查找。@PadraicCunningham您在评论中有非常好的观点。为什么不将它们总结成一个答案呢?我使用select检索dt类名的实例。它没有给出所有的结果,而是给出了10个实例。是否有一个默认值需要更改?@LakshmiNarayanan,你确定html没有被破坏或以某种方式动态添加吗?我必须发出一个向下滚动命令来完全加载html。虽然页面已加载,但html没有加载。谢谢你的回复!find…()
方法不需要class\u=
或只需要一个“class”
键的字典,因为如果第二个参数是字符串,那就是类值。css选择器非常棒,即使BeautifulSoup