python 爬虫之find、find

BeautifulSoup 文档里,find、find_all两者的定义如下:

find_all(tag, attributes, recursive, text, limit, keywords)

find_all(标签、属性、递归、文本、限制、关键词)

find(tag, attributes, recursive, text, keywords)

find与find_all的区别,find只会取符合要求的第一个元素,find_all会根据范围限制参数limit限定的范围取元素(默认不设置代表取所有符合要求的元素,find 等价于 find_all的 limit =1 时的情形),接下来将对每个参数一一介绍。

另外,find_all会将所有满足条件的值取出,组成一个list

一、标签tag

标签参数 tag 可以传一个标签的名称或多个标签名称组成的set做标签参数。例如,下面的代码将返回一个包含 HTML 文档中所有标题标签的列表: find_all({'h1','h2','h3'})

下面以中原网页面举例,如下图,现在要将页面上的所有标题取出,观察html可以发现,标题对应的tag 是h4,则soup.find_all('h4')

  1. from bs4 import BeautifulSoup
  2. import requests
  3. url = 'https://gz.centanet.com/ershoufang/'
  4. urlhtml=requests.get(url)
  5. urlhtml.encoding='utf-8'
  6. soup=BeautifulSoup(urlhtml.text,'lxml')
  7. alink = soup.find_all('h4')
  8. print(alink)

上面例子只是一个标签的情况,如果多个标签写法相同,只是注意要将所有的标签写在一个set里面

二、属性attributes

属性参数 attributes 是用字典封装一个标签的若干属性和对应的属性值。如,下面这个函数会返回 HTML 文档里'house-name', 'house-txt'两种的 p 标签。find_all('p', {'class':{'house-name', 'house-txt'}})

如下图,现在要获取红色框选中的三行信息,通过观察可知,三行信息属性'house-name', 'house-txt',标签为p,则

  1. alink = soup.find_all('p', {'class':{'house-name', 'house-txt'}})
  2. print(alink)

三、递归recursive

递归参数 recursive 是一个布尔变量。你想抓取 HTML 文档标签结构里多少层的信息?如recursive 设置为 True, find_all 就会根据你的要求去查找标签参数的所有子标签,以及标签的子标签。如果 recursive 设置为 False, find_all 就只查找文档的一级标签。 find_all默认是支持递归查找的(recursive 默认值是 True);一般情况下这个参数不需要设置,非你真正了解自己需要哪些信息,而且抓取速度非常重要,那时你可以设置递归参数。

这个太少用了(反正我自己就没用过,不举例了)

四、文本text

文本参数 text 有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。

直接举例吧,在这个网页中,我们要查找一下,户型为“2室1厅”的有多少个,则

  1. alink = soup.find_all(text='2室1厅')
  2. print(alink)

需要特别注意一点,这里查找是用的是完全匹配原则,意思是如果这里你用了find_all(text='2室'),得到的结果会是0个

五、关键词keywords

关键词参数 keyword,自己选择那些具有指定属性的标签

同样是上面网页的内容,现在要取id='one2'的内容,则

  1. from bs4 import BeautifulSoup
  2. import requests
  3. url = 'http://zfcj.gz.gov.cn/data/laho/projectdetail.aspx?changeproInfoTag=1&changeSellFormtag=1&pjID=47140&name=fdcxmxx'
  4. urlhtml=requests.get(url)
  5. urlhtml.encoding='utf-8'
  6. soup=BeautifulSoup(urlhtml.text,'lxml')
  7. alink = soup.find_all(id='one2')
  8. print(alink)

注意:如果是class、id等参数,用keywords 或者attributes用法一样,如果是一些其他参数,则用keywords

(0)

相关推荐

    Database error: [You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '' at line 1]

    select ID from ac_posts where ziID =  ;