1、通过的名称和属性查找标签

和之前一样,抓取整个页面,然后创建一个BeautifulSoup对象。这里面“lxml”解析器需要另外下载。

pip3 install lxml
>>> from urllib.request import urlopen
>>> from bs4 import BeautifulSoup
>>> html = urlopen("http://www.pythonscraping.com/pages/warandpeace.html")
>>> bsObj = BeautifulSoup(html, "lxml")


finAll()可以获取页面中所有指定的标签,抽取只包含在<span class="green"></span>标签里的文字,这样就会得到一个人物名称的列表。.get_text()会把所有的标签都清除,返回一个只包含文字的字符串。

>>> nameList = bsObj.findAll("span", {"class":"green"})
>>> for name in nameList:
        print(name.get_text())



2、详解finAll()和find()的参数

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

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


tag--可以传一个标签的名称或多个标签名称组成的列表做参数;如下示例将返回一个包含HTML文档中所有标题标签的列表

>>> bsObj.findAll({"h1", "h2", "h3", "h4", "h5", "h6"})
[<h1>War and Peace</h1>, <h2>Chapter 1</h2>]


attributes--字典封装一个标签的若干属性和对应的属性值;如下示例会返回HTML文档里红色与绿色两种颜色的span标签

>>> bsObj.findAll("span", {"class":{"green", "red"}})


recursive--布尔变量(默认为True)查找标签参数的所有子标签,及子标签的子标签;为False时,只查找文档的一级标签


text--是用标签的文本内容去匹配;如下示例作用是查找网页中包含“the prince”内容的标签数量

>>> nameList=bsObj.findAll(text="the prince")
>>> print(len(nameList))
7


limit--按照网页上的顺序排序,获取的前 x 项结果(等于1时等价于find)


keywords--可以让你选择那些具有指定属性的标签

>>> allText = bsObj.findAll(id="text")
>>> print(allText[0].get_text())

下面两行代码是完全一样的

bsObj.findAll(id="text")
bsObj.findAll("", {"id":"text"})

由于class为关键字,使用keywords指定时需要多加一个下划线

bsObj.findAll(class_="green")
bsObj.findAll("", {"class":"green"})


3、BeautifulSoup对象

BeautifulSoup对象:如前面代码示例中的bsObj

Tag对象:BeautifulSoup对象通过find和findAll或直接调用子标签获取的一列象或单个对象(如bsObj.div.h1)

NavigableString对象:表示标签里的文字

Comment对象:查找 HTML 文档的注释标签


4、标签解析树的导航:通过标签在文档中的位置来查找标签。


处理子标签与后代标签:

子标签(child)是一个父标签的下一级。

后代标签(descendant)是指一个父标签下面所有级别的标签。

同样的

>>> from urllib.request import urlopen
>>> from bs4 import BeautifulSoup
>>> html = urlopen("http://www.pythonscraping.com/pages/page3.html")
>>> bsObj = BeautifulSoup(html, "lxml")

只想找出子标签,可以用.children;如下示例会打印giftList表格中所有产品的数据行(如使用.descendants将打印出二十几个标签)

>>> for child in bsObj.find("table", {"id":"giftList"}).children:
print(child)


处理兄弟标签:

next_siblings和previous_siblings将返回一组标签

next_sibling和previous_sibling将返回单个标签

如下示例会打印产品列表里除第一行外的所有行的产品

>>> for sibling in bsObj.find("table", {"id":"giftList"}).tr.next_siblings:
        print(sibling)


处理父标签:

parent 和 parents

如下示例会打印出指定图片对应的商品价格

>>> print(bsObj.find("img", {"src":"../img/gifts/img1.jpg"}).parent.previous_sibling.get_text())
$15.00