xpath爬取过程出现不规则数据的解决方法

在今天使用xpath库爬取boss直聘济南在找职位的信息时,遇到了一个获取列表元素溢出的情况,具体是什么样的问题,我下面贴图来看一下。
1
大家注意观察这两个职位信息,几乎信息都是规则分布的,但在公司规模信息那里却出现了不规则现象,当然这些不规则也会体现在html代码中。
2
3
大家可以看到,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)

猜你喜欢

转载自blog.csdn.net/qq_37744263/article/details/82933697
今日推荐