在今天使用xpath库爬取boss直聘济南在找职位的信息时,遇到了一个获取列表元素溢出的情况,具体是什么样的问题,我下面贴图来看一下。
大家注意观察这两个职位信息,几乎信息都是规则分布的,但在公司规模信息那里却出现了不规则现象,当然这些不规则也会体现在html代码中。
大家可以看到,html代码块中的不规则现象不利于我们对信息的提取,如果我们采用下面的方法硬获取,就会报出列表溢出的错误。
size = item.xpath('div[@class="info-company"]/div/p/text()')[2]
因为在缺少一个信息的p标签内不会有位置为[2]的信息,所以系统会报错。
所以我在这里用了一个异常处理来解决这个问题,解决方法如下。
try:
size = item.xpath('div[@class="info-company"]/div/p/text()')[2]
size1 = ''.join(size).strip().replace('\n', '')
except:
size = item.xpath('div[@class="info-company"]/div/p/text()')[1]
size1 = ''.join(size).strip().replace('\n', '')
这里为什么用了一个size1,是因为xpath返回的结果是列表类型的,我们把它转换成字符串类型易于处理,并且通过strip和replace方法来清理信息的空格和换行。
下面附上爬取boss直聘济南地区招聘信息的完整代码。
__author__ = "Hopes Li"
# 爬取boss直聘全济南招聘信息
# 职位,公司,地点,薪金,规模,经验
# 导入所需库
import requests
from requests.exceptions import RequestException
from bs4 import BeautifulSoup
from lxml import etree
# 获取网页源代码
def get_one_page(url):
try:
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) '
+ 'AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3510.2 Safari/537.36'}
response = requests.get(url, headers=headers)
response.encoding = 'utf-8'
html = response.text
soup = BeautifulSoup(html, 'lxml')
result = soup.prettify()
xhtml = etree.HTML(result)
return xhtml
except RequestException:
print("Error")
# 主函数解析写入
def main(urls):
xhtml = get_one_page(urls)
info = xhtml.xpath('//div[@class="job-primary"]')
with open(r'C:\Users\Administrator\Desktop\PythonPycharm\爬虫\Xpath库\Boss.csv', 'a', encoding='utf-8') as f:
for item in info:
position = item.xpath('div[@class="info-primary"]/h3/a/div[@class="job-title"]/text()')
position1 = ''.join(position).strip().replace('\n', '')
salary = item.xpath('div[@class="info-primary"]/h3/a/span[@class="red"]/text()')
salary1 = ''.join(salary).strip().replace('\n', '')
address = item.xpath('div[@class="info-primary"]/p/text()')[0]
address1 = ''.join(address).strip().replace('\n', '')
experience = item.xpath('div[@class="info-primary"]/p/text()')[1]
experience1 = ''.join(experience).strip().replace('\n', '')
company = item.xpath('div[@class="info-company"]/div/h3/a/text()')
company1 = ''.join(company).strip().replace('\n', '')
try:
size = item.xpath('div[@class="info-company"]/div/p/text()')[2]
size1 = ''.join(size).strip().replace('\n', '')
except:
size = item.xpath('div[@class="info-company"]/div/p/text()')[1]
size1 = ''.join(size).strip().replace('\n', '')
f.write('{},{},{},{},{},{}\n'.format(position1, salary1, address1, company1, size1, experience1))
# 执行
if __name__ == "__main__":
for i in range(1, 10):
urls = 'https://www.zhipin.com/c101120100/h_101120100/?page=' + str(i)
main(urls)