Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 美化组:.find()和.select()之间的区别_Python_Python 3.x_Beautifulsoup - Fatal编程技术网

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选择器。从本质上讲,这取决于用例和个人偏好
  • 就灵活性而言,我想你知道答案,
    soup.select(“div[id=foo]>div>div>div[class=fee]>span>a”)
    使用多链find/find\u all调用看起来很难看
  • bs4中css选择器的唯一问题是支持非常有限,第n个类型是唯一实现的伪类,像[href][src]这样的链接属性也不受支持,css选择器的许多其他部分也不受支持。但是像a[href=…]*、a[href^=]、a[href$=]等。。我认为这比
    find(“a”,href=re.compile(..)
    好得多,但这也是我个人的偏好
为了提高性能,我们可以运行一些测试,我修改了在800+html文件上运行的代码,这不是详尽的,但应该提供一些选项可读性和性能的线索:

修改后的功能包括:

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