Python NoneType 'объект не вызывается из-за (я думаю) функции str.split - PullRequest
0 голосов
/ 21 февраля 2020

Я пытаюсь получить информацию из файла html, просматривая все строки, начиная с td, а затем разбивая строки, чтобы получить только нужные мне строки со следующим кодом:

def scraper(filename):
    soup = BeautifulSoup(open(filename), 'html.parser')
    with open("test/"+filename.stem+".txt", "w") as outfile:
        search = soup.findAll('td')
        for tag in search:
            if re.search(r'regbutton|rgba|mibig', str(tag)):
                if re.search('regbutton', str(tag)):
                    outfile.write(str(tag.split()[2]) + '\n')
                if re.search('rgba', str(tag)):
                    outfile.write(str(tag.split()[17]) + '\n')
                if re.search('mibig', str(tag)):
                    outfile.write(str(re.findall('>(.+)<')) + '\n')

Но это приводит к этой ошибке:

Traceback (most recent call last):
  File "html_scrape.py", line 31, in <module>
    scraper(filename)
  File "html_scrape.py", line 23, in scraper
    outfile.write(str(tag.split()[2]) + '\n')
TypeError: 'NoneType' object is not callable
(antismash_v5) [lamma@fe1 actinobacteria]$

Мне дано понять, что это связано с тем, что я предполагаю, что в tag.split что-то нет, но я не знаю почему.

Редактировать:

Пример вывода результатов поиска по тегу td:

<td class="regbutton NRPS r2c1">
<a href="#r2c1">Region&amp;nbsp2.1</a>
</td>
<td><a class="external-link" href="https://mibig.secondarymetabolites.org/go/BGC0000324/1" target="_blank">coelibactin</a></td>
<td class="digits similarity-text" style="background-image: linear-gradient(to left, rgba(0, 100, 0, 0.3), rgba(0, 100, 0, 0.3) 100%, #ffffff00 100%)">100%</td>

Весь файл будет просто повторением этого с разными найденными вещами.

1 Ответ

0 голосов
/ 21 февраля 2020

Отладка 101: упростите вашу проблему и предоставьте себе больше информации.

Ваша проблема связана с tag.split (). Так что давайте проигнорируем файл .write и все остальное:

def scraper(filename):
    soup = BeautifulSoup(open(filename), 'html.parser')
    search = soup.findAll('td')
    for tag in search:
        print(tag)
        print(tag.split())
        print(tag.split()[2])

    #with open("test/"+filename.stem+".txt", "w") as outfile:
    #    search = soup.findAll('td')
    #    for tag in search:
    #        if re.search(r'regbutton|rgba|mibig', str(tag)):
    #            if re.search('regbutton', str(tag)):
    #                outfile.write(str(tag.split()[2]) + '\n')
    #            if re.search('rgba', str(tag)):
    #                outfile.write(str(tag.split()[17]) + '\n')
    #            if re.search('mibig', str(tag)):
    #                outfile.write(str(re.findall('>(.+)<')) + '\n')

Посмотрите на ваш вывод. Работает ли split так, как вы ожидаете?

Дополнительный вопрос: если split - встроенная строковая функция, почему вы сводите все в строки с помощью функции str?

ProTip: используйте REPL и запустить эти команды в интерактивном режиме. Используйте самоанализ, чтобы выяснить, что происходит. Вы можете использовать IDE и встроенный отладчик, но иногда все, что вам нужно, - это хорошо расположенное выражение для печати. ​​

...