Как отсортировать данные, извлеченные по имени тега

У меня есть эта строка кода, в которой я получаю некоторые данные из таблицы с именем тега:

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 

Извините, неясно, чего вы пытаетесь достичь. Ваш вывод соответствует веб-сайту, показанному на скриншоте. Вы также упоминаете, что пытаетесь что-то разобрать, но неясно что. Пожалуйста, (1) уточните свой вопрос, чтобы сделать его более понятным, (2) добавьте репрезентативный фрагмент веб-сайта, который вы хотите парсить, и (3) покажите нам, каков ваш ожидаемый результат.

nonDucor 27.06.2024 13:22

кажется, вам не нужно его сортировать, но вам нужно изменить код, который его очищает и очищает правильно, чтобы создавать пары (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)

furas 27.06.2024 13:22

если вы хотите создать DataFrame, вам нужно создать столбцы, используя шаг 2 в срезах [start:end:step] - column1 = span_texts[0:len(span_texts):2] (он начинается с 0) и column2 = span_texts[1:len(span_texts):2] (он начинается с 1)

furas 27.06.2024 13:30

кажется, вы даже не используете span_texts для хранения данных - и он должен сразу создать пары, span_texts.append(spanelement.text), а после цикла добавить это в глобальный список all_rows.append(span_texts). И после всех циклов с данными можно что-то делать. Попытка сделать что-то внутри циклов может оказаться бесполезной. И использование только print(f'Span element: {spanelement.text}') также не может решить эту проблему.

furas 27.06.2024 13:34

@furas, функция печати заключалась в том, чтобы увидеть, какие данные я могу получить, чтобы проверить себя; Я хочу добавить данные в базу данных, и это стало причиной использования DataFrame. попробую ваши предложения

Georgian Costea 27.06.2024 14:06
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы можете использовать библиотеку 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

furas 27.06.2024 13:58

окей... он должен создать отдельный словарь для каждой таблицы, а затем сохранить все эти словари в списке

Qian Zhang 27.06.2024 14:05

В моем случае создается около 250 словарей, потому что у меня 5 тд, поэтому мне нужно было удалить дубликаты, и я использовал: all_unique = pd.DataFrame(all_data).drop_duplicates().to_dict('records')

Georgian Costea 27.06.2024 14:40

Это создает мои 250, потому что, когда я добавляю ключ в словарь, каждый раз, когда вы используете каждый ключ и значение, я получил 5 ключей и значение, поэтому будет 5 для 50 записей, потому что у меня есть 50 таблиц, и именно поэтому я получил 250

Georgian Costea 27.06.2024 19:45

Если есть дубликаты (т. е. один ключ имеет несколько значений), вам необходимо обработать их, реализовав логику после нахождения элементов. Для каждой таблицы создайте новый словарь и заполните его парами ключ-значение из этой таблицы. Если ключ уже существует, добавьте значение в список, связанный с этим ключом.

Qian Zhang 27.06.2024 20:35

Другие вопросы по теме