Я пытаюсь использовать BeautifulSoup для анализа html документа. Я попытался написать код, который может анализировать документ, найти все таблицы и удалить те, которые имеют числовое / alphanumeri c соотношение> 15%. Я использовал код, данный в качестве ответа на этот предыдущий вопрос:
Удалить элемент HTML, если он содержит определенное количество цифр c символов
, но для по какой-то причине аргумент table.decompose () помечается как ошибка. Я был бы признателен за любую помощь, которую я мог бы получить с этим. Обратите внимание, что я новичок, и поэтому, хотя я и стараюсь, я не всегда понимаю, более сложные решения!
Вот код:
test_file = 'locationoftestfile.html'
# Define a function to remove tables which have numeric characters/ alphabetic and numeric characters > 15%
def remove_table(table):
table = re.sub('<[^>]*>', ' ', str(table))
numeric = sum(c.isdigit() for c in table)
print('numeric: ' + str(numeric))
alphabetic = sum(c.isalpha() for c in table)
print('alpha: ' + str(alphabetic))
try:
ratio = numeric / float(numeric + alphabetic)
print('ratio: '+ str(ratio))
except ZeroDivisionError as err:
ratio = 1
if ratio > 0.15:
table.decompose()
# Define a function to create our Soup object and then extract text
def file_to_text(file):
soup_file = open(file, 'r')
soup = BeautifulSoup(soup_file, 'html.parser')
for table in soup.find_all('table'):
remove_table(table)
text = soup.get_text()
return text
file_to_text(test_file)
Это вывод / ошибка, которую я получаю:
numeric: 1
alpha: 55
ratio: 0.017857142857142856
numeric: 9
alpha: 88
ratio: 0.09278350515463918
numeric: 20
alpha: 84
ratio: 0.19230769230769232
---------------------------------------------------------------------------
AttributeError Traceback (most recent call last)
<ipython-input-28-c7e380df4fdc> in <module>
----> 1 file_to_text(test_file)
<ipython-input-27-9fb65cec1313> in file_to_text(file)
16 ratio = 1
17 if ratio > 0.15:
---> 18 table.decompose()
19 text = soup.get_text()
20 return text
AttributeError: 'str' object has no attribute 'decompose'
Обратите внимание, что аргумент table.decompose()
отличается от аргумента, приведенного в решении, которое я связал. Это решение использует
return True
else:
return False
, но, возможно, наивно, я не понимаю, как это уберет таблицу.