在使用python编写爬虫程序时对于bs4中select函数的使用一直有点迷糊,所以在此记录一些片段化的知识。
1、select函数的使用
1.1 获取HTML文件
在使用bs4这个库之前需要使用先使用requests库将目标网页的html文件调用过来。
headers = {'sec-ch-ua': '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"',
'sec-ch-ua-mobile':'?0',
'sec-ch-ua-platform':"Windows",
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'
}
url = 'https://aviation-safety.net/database/record.php?id=20210208-0'
result = requests.get(url, headers = headers)
此处的headers是第一次使用浏览器进入目标网页后,在请求过程中请求头中所包含的内容,可以使用chrome浏览器右键点击进入检查界面,在network选项卡中点击第一个事项,右下角会自动弹出相关内容。
如果不事先说明请求头,在获得目标网页的HTML文件时,一些网站会自动拦截爬取程序。
在设置完请求头之后,就可以使用requests库直接向目标网页发起请求。代码如下:
url = 'https://aviation-safety.net/database/record.php?id=20210208-0'
result = requests.get(url, headers = headers)
url是目标网页的详细网址,这里使用的是get方法获取HTML文件,某些网站需要提交post表单才可以,不过作者爬取的这个网站,get就可以。
1.2 HTML文件调用至bs4
将获取的HTML文件调用至bs4,生成其独有的树状结构体才可以使用其强大的选择功能进行各种随心所欲的操作,代码如下:
soup = bs4.BeautifulSoup(result.text,'lxml')
代码中的result.text是把上文中变量result的文本调用过来,‘lxml’是解析方法,对于不同的文件也可以选择其他方法,其他建议自查。
1.3 select函数使用
通过chrome浏览器的检查模式找到需要爬取的内容所在的目标节点后,鼠标放置在节点上右键点击选择 copy-copy selector即可得到该节点的路径,代码如下:
status = soup.select('#contentcolumn > div > span:nth-child(4)')
括号中的即是复制得到的节点路径,运行之后目标节点的信息会保存至status中,这里如果要使用 get_text() 方法获取文本时,一定注意select生成的是一个 tag 类,也可以看作是一个列表,如:
print(status[0].get_text())
是可以直接输出节点内容的,而如下代码会直接报错:
print(status.get_text())
报错信息如下:
AttributeError: ResultSet object has no attribute 'get_text'. You're probably treating a list of elements like a single element. Did you call find_all()
原因在于select生成的是一个列表类的数据,可以循环调用也可以用下表引用,就是不能直接用,即便你知道里面只有一个节点。
还有一种报错信息如下:
IndexError: list index out of range
这种报错信息的原因是select没有获取到节点信息,返回的是空列表,所以 result[0] 报错,解决方案后续作者会发上来。
完整代码如下:
import requests
import bs4
headers = {'sec-ch-ua': '"Google Chrome";v="93", " Not;A Brand";v="99", "Chromium";v="93"',
'sec-ch-ua-mobile':'?0',
'sec-ch-ua-platform':"Windows",
'Upgrade-Insecure-Requests':'1',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4577.63 Safari/537.36'
}
url = 'https://aviation-safety.net/database/record.php?id=20210208-0'
result = requests.get(url, headers = headers)
soup = bs4.BeautifulSoup(result.text,'lxml')
status = soup.select('#contentcolumn > div > span:nth-child(4)')
print(status[0].get_text())
|