Ошибка типа: набор результатов не вызывается - BeautifulSoup - PullRequest
1 голос
/ 12 мая 2019

У меня проблема с веб-очисткой. Я пытаюсь научиться делать это, но я не могу пройти мимо некоторых основ. Я получаю сообщение об ошибке: «TypeError: объект ResultSet не может быть вызван» - это ошибка, которую я получаю.

Я пробовал много разных вещей. Первоначально я пытался использовать функцию «найти» вместо «find_all», но у меня возникла проблема с вытягиванием Beautifulsoup, не относящимся к типу. Мне не удалось создать цикл if, который мог бы преодолеть это исключение, поэтому я попытался использовать вместо него «find_all».

page = requests.get('https://topworkplaces.com/publication/ocregister/')

soup = BeautifulSoup(page.text,'html.parser')all_company_list = 
soup.find_all(class_='sortable-table')
#all_company_list = soup.find(class_='sortable-table')


company_name_list_items = all_company_list('td')

for company_name in company_name_list_items:
    #print(company_name.prettify())
    companies = company_name.content[0]

Я бы хотел, чтобы все компании в округе Ориндж, штат Калифорния, которые включены в этот список, были чистыми. Как видите, я уже выполнил их, но хочу, чтобы список был чистым.

Ответы [ 2 ]

0 голосов
/ 12 мая 2019

У вас правильная идея.Я думаю, вместо того, чтобы сразу находить все теги <td> (которые будут возвращать по одному <td> для каждой строки (140 строк) и каждого столбца в строке (4 столбца)), если вам нужны только названия компаний,может быть проще найти все строки (теги <tr>), а затем добавить столько столбцов, сколько вы хотите, итерируя <td> в каждой строке.Будет получен первый столбец с названиями компаний:

import requests
from bs4 import BeautifulSoup

page = requests.get('https://topworkplaces.com/publication/ocregister/')

soup = BeautifulSoup(page.text,'html.parser')
all_company_list = soup.find_all('tr')

company_list = [c.find('td').text for c in all_company_list[1::]]

Теперь company_list содержит все 140 названий компаний:

 >>> print(len(company_list))

['Advanced Behavioral Health', 'Advanced Management Company & R³ Construction Services, Inc.',
...
, 'Wes-Tec, Inc', 'Western Resources Title Company', 'Wunderman', 'Ytel, Inc.', 'Zillow Group']

Измените c.find('td') на c.find_all('td') и повторите этосписок, чтобы получить все столбцы для каждой компании.

0 голосов
/ 12 мая 2019

Панды:

Панды часто полезны здесь.Страница использует несколько видов, включая размер компании, рейтинг.Я показываю рейтинг сортировки.

import pandas as pd

table = pd.read_html('https://topworkplaces.com/publication/ocregister/')[0]
table.columns = table.iloc[0]
table = table[1:]
table.Rank = pd.to_numeric(table.Rank)
rank_sort_table = table.sort_values(by='Rank', axis=0, ascending = True)
rank_sort_table.reset_index(inplace=True, drop=True)
rank_sort_table.columns.names = ['Index']
print(rank_sort_table)

В зависимости от вашего вида, компании в порядке:

print(rank_sort_table.Company)

Запросы:

КстатиВы можете использовать nth-of-type, чтобы выбрать только первый столбец (названия компаний) и использовать id, а не имя класса, чтобы идентифицировать таблицу как более быструю

import requests
from bs4 import BeautifulSoup as bs

r = requests.get('https://topworkplaces.com/publication/ocregister/')
soup = bs(r.content, 'lxml')
names = [item.text for item in soup.select('#twpRegionalList td:nth-of-type(1)')]
print(names)

Обратите внимание, что сортировка по умолчанию в алфавитном порядке по именистолбец, а не ранг.


Ссылка:

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.sort_values.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...