以下代码将url中css样式为class:green的数据解析出来,并使用get_text()剔除标签结构;一般来说使用BeautifulSoup时需要CSS的标签结构,所以只需要在最后保存或者打印数据时调用get_text()
from urllib.request import urlopen
from urllib.error import HTTPError
from bs4 import BeautifulSoup
# 解析CSS
def spanCSS():
url = "http://www.pythonscraping.com/pages/warandpeace.html"
try: html = urlopen(url)
except HTTPError as e: print(e)
try:
bsObj = BeautifulSoup(html, features="html5lib")
nameList = bsObj.findAll("span", {"class": "green"})
except AttributeError as e: print(e)
for name in nameList:
# 最后打印数据时,可以把标签结构删除
print(name.get_text())
调用库BeautifulSoup时,这两个函数将经常被用到(主要是前两个参数tag和attributes):
find 其实等价于 findAll 的 limit 等于1 时的情形
findAll(tag, attributes, recursive, text, limit, keywords)
find(tag, attributes, recursive, text, keywords)
tag:标签名;attribute:属性;recursive:支持递归查找;text:使用文本匹配;
例如:
html.findAll("span", {"class":{"green", "red"}})
这行代码将会找出html文档中绿色和红色两种颜色的span标签<span class="green">Hello world!</span>
让标签的选择更具体:
bsObj.find("table",{"id":"giftList"}).tr
bsObj.table.tr
使用第一行代码而不是第二行,因为这样可以避免各种意外。页面布局总是不断变化的,一个标签这次是在表格中第一行的位置,
没准儿哪天就在第二行或第三行了。 如果想让你的爬虫更稳定,最好还是让标签的选择更加具体。如果有属性,就利用标签的属性。