Чтобы просто отфильтровать данные на основе определенного поля (первое в вашем примере), вы можете построить понимание:
[element for element in data if 'New Britain' in element[0]]
В приведенном вами примере исключены пустые значения, которые делают элементы данныхимеют разные размеры.Это затрудняет понимание того, какое поле соответствует каждому компоненту данных.Используя диктовки, мы можем сделать данные более понятными и удобными для обработки.
В некоторых полях, по-видимому, содержатся пустые куски (только с пробелами ['\n'
, '\r'
, * 1008)*, ' '
]).Так что стриптиз не уберет.Объединение этого с простым регулярным выражением может помочь улучшить это.Я написал для этого простую функцию:
def squish(s):
return re.sub(r'\s+', ' ', s)
Подводя итог, я думаю, это вам поможет:
import re
import requests
from bs4 import BeautifulSoup
def squish(s):
return re.sub(r'\s+', ' ', s)
def filter_by_location(data, location_name):
return [x for x in data if location_name.lower() in x['Location'].lower()]
mypage = 'http://lci-mt.iii.com/iii/encore/record/C__Rb1872125__S%28*%29%20f%3Aa%20c%3A47__P0%2C3__Orightresult__U__X6?lang=eng&suite=cobalt'
response = requests.get(mypage)
soup = BeautifulSoup(response.text, 'html.parser')
data = []
table = soup.find('table', attrs={'class':'itemTable'})
headers = [squish(element.text.strip()) for element in table.find('tr').find_all('th')]
for row in table.find_all('tr')[1:]:
cols = [squish(element.text.strip()) for element in row.find_all('td')]
data.append({k:v for k, v in zip(headers, cols)})
filtered_data = filter_by_location(data, 'New Britain')
for x in filtered_data:
print('Location: {}'.format(x['Location']))
print('Status: {}'.format(x['Status']))
print()
Запустив его, я получил следующий результат:
Location: New Britain, Jefferson Branch - Children's Department
Status: Check Shelf
Location: New Britain, Main Library - Children's Department
Status: Check Shelf
Location: New Britain, Main Library - Children's Department
Status: Check Shelf