Проблема с Python и Beautifulsoup при удалении пустого тега в объекте супа - PullRequest
0 голосов
/ 11 января 2019

Давний пользователь 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>

Если бы кто-то мог помочь мне понять это, это было бы замечательно.

1 Ответ

0 голосов
/ 12 января 2019

декомпозировать () достаточно, чтобы решить вашу проблему.

from bs4 import BeautifulSoup
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>
"""
soup=BeautifulSoup(html,'html.parser')
for tag in soup.find_all('dt',attrs={"class":"dlterm"}): #all dl tags with class dlterm
    if not tag.text: #if tag is empty
        tag.decompose()
print(soup)

выход

<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">Term3</dt><dd><samp class="codeph">nonNegativeInteger</samp></dd><dd class="ddexpand">Blah blah about term3</dd>
</dl></div>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...