Проверить, существует ли 2-й дочерний столбец в строке [тег Python BeautifulSoup bs4]

Я построил скраппер для следующего сайта https://web.acma.gov.au/rrl/assignment_search.lookup?pEFL_ID=5227509

и зеленый заголовок строки появляется случайным образом для разных страниц.

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

Есть ли способ проверить (есть ли второй столбец td в tr) в строке кода sup.select_one???? поэтому мне не нужно использовать текстовые фильтры/правила, которые могут быть случайными.

Вот мой код ссылка на github = https://github.com/hassanharis/ACMA-Scrapper/blob/main/ACMAscrapper.ipynb


AntennaTableHeader = ['Licence Number', 'Device Registration ID', 'Client', 'Date Authorised', 'Device Type','Emission Center Frequency', 'Antenna', 'Antenna Height (AGL)', 'Antenna Polarisation','Antenna Azimuth', 'Antenna Tilt']
AntennaTable = pd.DataFrame(columns = AntennaTableHeader)

for acmalink in ACMAdata['links'][0]:
    url = 'https://web.acma.gov.au'+ acmalink
    # Create object page
    page = requests.get(url)
    soup2 = BeautifulSoup(page.text, 'lxml')
    Antennaheaders = [td.text for td in soup2.select_one('table',{"class": "tabledetail"}).select('td:nth-of-type(1)')]
    AntennaValues = [td.text.strip() for td in soup2.select_one('table',{"class": "tabledetail"}).select('td:nth-of-type(2)')]
    results = []
    if 'Registration and Application Details - 1' in Antennaheaders:
        Antennaheaders.remove('Registration and Application Details - 1')
    if 'Receiver Details' in Antennaheaders:
        Antennaheaders.remove('Receiver Details')
    if 'Registration and Application Details' in Antennaheaders:
        Antennaheaders.remove('Registration and Application Details')
    if 'Transmitter Details' in Antennaheaders:
        Antennaheaders.remove('Transmitter Details')
    if 'Device Details' in Antennaheaders:
        Antennaheaders.remove('Device Details')
    if 'Assignment and Application Details' in Antennaheaders:
        Antennaheaders.remove('Assignment and Application Details')
       



    AntennaDictionary = {Antennaheaders[i]: AntennaValues[i] for i in range(len(Antennaheaders))}
    AntennaTable_toAdd = pd.DataFrame([AntennaDictionary])
    AntennaTable = pd.concat([AntennaTable, AntennaTable_toAdd], ignore_index=True)

Ожидаю лучшего и гибкого/динамического способа выбора строки таблицы со случайными заголовками строк на разных веб-страницах, которые я очищаю

Почему в 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 может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
51
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вам нравится использовать beautifulsoup, вы можете исключить строки с атрибутом colspan, используя css-селекторы:

[
    dict(
        (e.td.text.strip(),e.td.find_next('td').text.strip()) 
        for e in soup.select('.tabledetail tr:has(:not(td[colspan]))')
    )
]
Пример
import requests
import pandas as pd
from bs4 import BeautifulSoup
url = 'https://web.acma.gov.au/rrl/assignment_search.lookup?pEFL_ID=5227509'
soup = BeautifulSoup(requests.get(url).text)

pd.DataFrame(
    [
        dict(
            (e.td.text.strip(),e.td.find_next('td').text.strip()) 
            for e in soup.select('.tabledetail tr:has(:not(td[colspan]))')
        )
    ]
)
Ответ принят как подходящий

Наконец-то я решил проблему, используя список понимания из python и документацию прекрасного супа.

я могу отфильтровать случайные строки заголовков, используя colspan или класс, поскольку эти теги присутствуют только в строках заголовков.

Решение

if not td.has_attr('class')

В коде

Antennaheaders = [td.text for td in soup2.select_one('table',{"class": "tabledetail"}).select('td:nth-of-type(1)') if not td.has_attr('class')]

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