Как исправить “ожидаемую строку или байтоподобный объект” при попытке обхода информации с веб-сайта?

#python-3.x

#python-3.x

Вопрос:

Привет, я пытаюсь выполнить обход некоторой информации с веб-сайта по подбору персонала в Китае, и я сталкиваюсь с некоторыми проблемами с моим кодом. Ошибка типа «ожидаемый объект, подобный строке или байтам». Пожалуйста, смотрите последний абзац для получения более подробной информации.

Я уже пробовал искать вопросы, которые соответствуют моему коду ошибки, но безрезультатно.

 # BEGINNING OF CODE 

import re
import csv
import requests
from tqdm import tqdm
from urllib.parse import urlencode
from requests.exceptions import RequestException

# Define parameters and headers 

def get_one_page(city, keyword,page):
'''
Obtain content of HTML
'''
paras = {
    "jl": city,
    "kw": keyword, 
    "kt":3,
    "p":page,
}


headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) 
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
'Origin': 'sou.zhaopin.com',
'Referer': 'https://www.zhaopin.com/',
'Accept': 'application/json, text/plain, */*',
'DNT': 1
}
url = 'https://sou.zhaopin.com/?'   urlencode(paras)

# Attempt to connect to website

try:

    response = requests.get(url, headers=headers)
    if response.status_code == 200:
        return response.text
    return None
except RequestException as e:
    return None
# Crawling begins

def parse_one_page(html):


pattern = re.compile( '<a href="(.*?)" zp-stat-jdno=".*?" zp-stat-pos=".*?" zp-stat-pageno=".*?" zp-stat-pagelim=".*?" zp-stat-funczone=".*?" target="_blank" zp-stat-track=".*?" zp-stat-id=".*?" class="contentpile_content_wrapper_item_info">.*?' # Match job link 
                     '<span title="(.*?)" class="contentpile__content__wrapper__item__info__box__jobname__title">.*?' # Match job
                     '<a href=".*?" title="(.*?)" target="_blank" class="contentpile_content_wrapper_item_info_box_cname_title company_title">.*?' # Match company
                     '<p class="contentpile_content_wrapper_item_info_box_job_saray">(.*?)</p>.*?' # Match salary
                     '<span class="contentpile_content_wrapper_item_info_box_job_comdec_item">(.*?)</span>.*?' # Match type of company
                     '<span class="contentpile_content_wrapper_item_info_box_job_comdec_item">(.*?)</span>',re.S# Match no. of people

                    )


items = re.findall(pattern, html)   

for item in items:

    yield {
        'Source Link': item[0],
        'Job': item[1],
        'Company': item[2],
        'Salary': item[3],
        'Type': item[4],
        'No. of people' : item[5]
    }

# Output of results to csv file

import csv
def write_csv_headers(path,headers,rows):
 with open(path, 'a', encoding='gb18030', newline='') as f:
    f_csv = csv.DictWriter(f, headers)
    f_csv.writeheader()
    f_csv.writerows(rows)

def write_csv_headers(path, headers):

with open(path, 'a', encoding='gb18030', newline='') as f:
    f_csv = csv.DictWriter(f, headers)
    f_csv.writeheader()

def write_csv_rows(path, headers, rows):

with open(path, 'a', encoding='gb18030', newline='') as f:
    f_csv = csv.DictWriter(f, headers)
    f_csv.writerows(rows)

def main(city,keyword,page):

filename ='zl_'   city   '_'   keyword   '.csv'
headers = ['Source Link', 'Job', 'Company', 'Salary','Type','No. of 
people']
write_csv_headers(filename, headers)
for i in tqdm(range(page)):
    '''
    Obtaining info from website
    '''
    jobs = []
    html = get_one_page(city, keyword,i)
    items = parse_one_page(html)
    for item in items:
        jobs.append(item)
    write_csv_rows(filename, headers, jobs)

if __name__ == '__main__':
main('北京','软件测试', 10)        
  

Код ошибки выглядит следующим образом. Заранее благодарю вас.

 TypeError                                 Traceback (most recent call 
last)
 <ipython-input-147-fabe9e8e72a1> in <module>()
 34 
 35 if __name__ == '__main__':
---> 36   main('北京','软件测试', 10)
 37 
 38 

<ipython-input-147-fabe9e8e72a1> in main(city, keyword, page)
 29       html = get_one_page(city, keyword,i)
 30       items = parse_one_page(html)
 ---> 31       for item in items:
 32           jobs.append(item)
 33       write_csv_rows(filename, headers, jobs)

<ipython-input-146-ca89bf3877ad> in parse_one_page(html)
 13 
 14     # 匹配所有符合条件的内容
 ---> 15     items = re.findall(pattern, html)
 16 
 17     for item in items:

 /usr/lib/python3.6/re.py in findall(pattern, string, flags)
220 
221     Empty matches are included in the result."""
--> 222     return _compile(pattern, flags).findall(string)
223 
224 def finditer(pattern, string, flags=0):

TypeError: expected string or bytes-like object
  

Комментарии:

1. Вероятно, html есть None . Добавьте print(html) перед items = re.findall(pattern, html) строкой, чтобы проверить это.

Ответ №1:

Проблема связана с методом, get_one_page который выдает исключение. Вы должны изменить тип DNT параметра на str

DNT: 1 должно быть DNT: '1'

Итак, ваши заголовки должны быть такими:

 headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/73.0.3683.86 Safari/537.36',
        'Origin': 'sou.zhaopin.com',
        'Referer': 'https://www.zhaopin.com/',
        'Accept': 'application/json, text/plain, */*',
        'DNT': '1'
    }