Я построил скраппер для следующего сайта 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)
Ожидаю лучшего и гибкого/динамического способа выбора строки таблицы со случайными заголовками строк на разных веб-страницах, которые я очищаю






Если вам нравится использовать 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')]