Давний пользователь SO, только недавно создал аккаунт. Это моя вторая попытка задать вопрос здесь. Я довольно новичок в Python, но у меня есть опыт программирования и я очень плохо знаком с веб-утилизацией.
Проблема
Я написал функцию для загрузки серии файлов HTML, которые все очень сформатированы. Затем я использую BeautifulSoup для анализа файлов HTML и в конечном итоге загрузки данных в таблицу SQL. Я делаю анализ пробелов в столбцах / таблицах, которые мы уже должны увидеть, насколько они отличаются. Я пытаюсь прочитать определенный тег HTML, а в некоторых случаях есть дополнительный пустой набор тегов. Что я действительно хотел сделать, так это просто удалить эту дополнительную запись и двигаться дальше. Я пытался использовать функцию degpose (), а также пытался ссылаться на значение по индексу и выполнял удаление.
<dt class="dlterm"></dt>
Это отбрасывает мои столбцы, так как я пытаюсь позже сохранить их имя, тип данных и описание в виде записи. Я не могу понять, как удалить его и продолжать анализ файла.
Я могу заставить Python найти <dt class="dlterm"></dt>
и попробовать разложить (), метод pop (), я даже подумывал придумать смещение и установить переменную равной 1, когда она его найдет, а затем каким-то образом сместить остаток кода на 1 для этой итерации цикла.
Одно из решений, которое я уже нашел, состоит в том, чтобы полностью обойти это, открыв исходный файл и заменив тег <dt class="dlterm"></dt>
, прежде чем я попытаюсь прочитать это с помощью Beautifulsoup. Чтобы позаимствовать термин у старого сотрудника, это «слабый выход». Это бы сработало, но похоже на большой код для простой проблемы.
Вопрос
Я думал, что объект супа был списком, но он так себя не ведет? Какой термин подходит для супового объекта?
Фрагмент кода Python
# Load the cursor/recordset
myrecordset = mycursor.fetchall()
# Outer loop
for y in myrecordset:
myfilepath = "myexample.html" % y[2]
soup = BeautifulSoup(open(myfilepath),"html.parser")
PageName = soup.find("h1",{"class":"topictitle1"})
# print ("PageName: " + PageName.text)
FieldName = soup.find_all("dt", {"class":"dlterm"})
FieldDataType = soup.find_all("samp", {"class":"codeph"})
FieldDesc = soup.find_all("dd", {"class":"ddexpand"})
# outercounter = -1
#
# #Fix the empty value issue early that is offsetting everything
# for z in FieldName:
# outercounter+=1
# # FieldName[7].decompose()
# if z.text == '': # '<dt class="dlterm"></dt>':
# z.decompose()
#
# # FieldName[outercounter-1].pop()
# How to get get the description cleaned up
# FieldDesc[2].text.replace('\n','').replace(' ', ' ')
# print(FieldName.text)
# print(FieldDataType.text)
# print(FieldDesc.text)
# inner loop
innercounter1 = 0
# zip allows me to iterate through multiple lists at the same time
for (fn, fdt, fd) in zip(FieldName, FieldDataType, FieldDesc):
fntemp= ''
fdttemp= ''
fdtemp= ''
fntemp = fn.text
fdttemp = fdt.text
# clean the string
if fd.text.__contains__('One of:'):
# hold onto the double return while I replace the others.
fdtemp = fd.text.replace('\n\n', '<<nn>>')
fdtemp = fdtemp.replace('\n',', ')
fdtemp = fdtemp.replace('<<nn>>', '\n')
else:
fdtemp = fd.text.replace('\n', ' ')
fdtemp = fdtemp.strip()
# remove all redundant spaces from the string
fdtemp = " ".join(fdtemp.split())
# have to escape single quotes in text so it will insert correctly
fdtemp = fdtemp.replace("'", "''")
#Insert into SQL
# ... code continued
Фрагмент из файла HTML, показывающий проблему
<div class="section">
<h2 class="sectiontitle">Title</h2>
<dl>
<dt class="dlterm">Term1</dt><dd><samp class="codeph">nonNegativeInteger</samp></dd><dd class="ddexpand">Blah blah blah about term1</dd>
<dt class="dlterm">Term2</dt><dd><samp class="codeph">nonNegativeInteger</samp></dd><dd class="ddexpand">Blah blah blah about term2</dd>
<dt class="dlterm"></dt><dt class="dlterm">Term3</dt><dd><samp class="codeph">nonNegativeInteger</samp></dd><dd class="ddexpand">Blah blah about term3</dd>
</dl></div>
Если бы кто-то мог помочь мне понять это, это было бы замечательно.