#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'
}