У меня есть эта строка кода, в которой я получаю некоторые данные из таблицы с именем тега:
data_coverage_dict = {}
row_id = 0
# Finally: Iterate through the ul elements
for tableElement in tableElements:
trElements = tableElement.find_elements(By.TAG_NAME, 'tr')
# print(f'aici este tr: {tableElement.text}')
for tdelement in trElements:
tdelements = tdelement.find_elements(By.TAG_NAME,'td')
span_texts = []
# print(f'aici este td: {tdelement.text}')
for spanelement in tdelements:
spanelements = spanelement.find_elements(By.TAG_NAME,'span')
# data_coverage_table = []
# for index in spanelements:
# row_data = [cell.text for cell in spanelements[index:index]]
# data_coverage_table.append(row_data)
# print(f'data table:{data_coverage_table}')
print(f'Span element: {spanelement.text}')
В коде я пытался отсортировать список или словарь, но мой ожидаемый результат, когда я получил данные, был следующим:
Элемент Span: Имя подрядчика
Элемент Span: ЛАНДШАФТНЫЕ РАСТЕНИЯ FANCEE
Элемент диапазона: DBA
Элемент диапазона: Лицензия
Элемент диапазона: 439423
Элемент диапазона: Город
Элемент пролета: РИВЕРСАЙД
Элемент диапазона: Статус
Элемент Span: Отменено
Элемент Span: Имя подрядчика
Элемент Span: FANCHBILT INCORPORATED
Элемент Span: Имя Тип
Элемент диапазона: DBA
Элемент диапазона: Лицензия
Элемент пролета: 520066
Элемент диапазона: Город
Элемент пролета: LAGUNA WOODS
Элемент диапазона: Статус
Элемент Span: Отменено
и сайт, с которого я хочу извлечь данные, имеет такой вид:
и я хочу получить имя контракта = с конкретным именем контракта, я выбираю find_element по имени тега, потому что сайт является динамическим, и я не могу использовать определенный XPath, классы или идентификаторы. ТАКЖЕ я думал использовать фрейм данных, но не знаю, как сортировать по первому и второму элементу диапазона. Код сайта:
<table>Info</table>
<tr>info tr</tr>
<td>First element(in my case:Contract Name)</td
<td>Second element(in my case:FANCEE PLANTS LANDSCAPING)</td>
Expected result:
Contractor Name = FANCEE PLANTS LANDSCAPING
кажется, вам не нужно его сортировать, но вам нужно изменить код, который его очищает и очищает правильно, чтобы создавать пары (name, values)
(вместо добавления всех в один список). В конце концов, возможно, потребуется использовать (span_texts[0], span_texts[1])
, (span_texts[2], span_texts[2])
... (span_texts[i], span_texts[i+1])
для создания пар. может понадобиться for i in range(0, len(span_texts), 2)
если вы хотите создать DataFrame, вам нужно создать столбцы, используя шаг 2 в срезах [start:end:step]
- column1 = span_texts[0:len(span_texts):2]
(он начинается с 0
) и column2 = span_texts[1:len(span_texts):2]
(он начинается с 1
)
кажется, вы даже не используете span_texts
для хранения данных - и он должен сразу создать пары, span_texts.append(spanelement.text)
, а после цикла добавить это в глобальный список all_rows.append(span_texts)
. И после всех циклов с данными можно что-то делать. Попытка сделать что-то внутри циклов может оказаться бесполезной. И использование только print(f'Span element: {spanelement.text}')
также не может решить эту проблему.
@furas, функция печати заключалась в том, чтобы увидеть, какие данные я могу получить, чтобы проверить себя; Я хочу добавить данные в базу данных, и это стало причиной использования DataFrame. попробую ваши предложения
Вы можете использовать библиотеку Selenium в Python для поиска элементов на веб-странице –
from selenium.webdriver.common.by import By
all_data = []
# Iterate through each table element
for tableElement in tableElements:
data_coverage_dict = {}
trElements = tableElement.find_elements(By.TAG_NAME, 'tr')
for trElement in trElements:
tdElements = trElement.find_elements(By.TAG_NAME, 'td')
if len(tdElements) == 2:
key = tdElements[0].text.strip()
value = tdElements[1].text.strip()
data_coverage_dict[key] = value
all_data.append(data_coverage_dict)
Проверь это -
for index, table_data in enumerate(all_data):
print(f"Table {index + 1}:")
for key, value in table_data.items():
print(f'{key}: {value}')
Я думаю, что у него может быть одна проблема: у OP много таблиц с одинаковыми ключами (например, Contractor Name
), а ваш data_coverage_dict
будет иметь значения только для последней таблицы. Возможно, потребуется создать data_coverage_dict
внутри for tableElement
, а затем добавить его в новый список all_data
окей... он должен создать отдельный словарь для каждой таблицы, а затем сохранить все эти словари в списке
В моем случае создается около 250 словарей, потому что у меня 5 тд, поэтому мне нужно было удалить дубликаты, и я использовал: all_unique = pd.DataFrame(all_data).drop_duplicates().to_dict('records')
Это создает мои 250, потому что, когда я добавляю ключ в словарь, каждый раз, когда вы используете каждый ключ и значение, я получил 5 ключей и значение, поэтому будет 5 для 50 записей, потому что у меня есть 50 таблиц, и именно поэтому я получил 250
Если есть дубликаты (т. е. один ключ имеет несколько значений), вам необходимо обработать их, реализовав логику после нахождения элементов. Для каждой таблицы создайте новый словарь и заполните его парами ключ-значение из этой таблицы. Если ключ уже существует, добавьте значение в список, связанный с этим ключом.
Извините, неясно, чего вы пытаетесь достичь. Ваш вывод соответствует веб-сайту, показанному на скриншоте. Вы также упоминаете, что пытаетесь что-то разобрать, но неясно что. Пожалуйста, (1) уточните свой вопрос, чтобы сделать его более понятным, (2) добавьте репрезентативный фрагмент веб-сайта, который вы хотите парсить, и (3) покажите нам, каков ваш ожидаемый результат.