К вашему сведению (если вы хотите знать основную причину вашей проблемы) цель table
имеет недопустимую разметку:
<table class ="tab" cellpadding= "5" ... STYLE="border-spacing: 0px;border-style: line ;
<tr bgcolor="#DAD5BF"></tr>
Обратите внимание, что начальный тег не закрыт: <table ...
(должно быть [ 113]), а также предком является <div>
, а закрывающий тег - </p>
. Поэтому BeautifulSoup не распознает это как table
и, следовательно, он не возвращается soup.find_all('table')
table
не выглядит «сломанным»: закрытие </div>
добавляется к предку div
, в то время как тег p
превращается в пустой узел <p></p>
ОБНОВЛЕНО:
Один из способов - посмотреть на sys.maxsize
, как описано здесь :
$ python-32 -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffff', False)
$ python-64 -c 'import sys;print("%x" % sys.maxsize, sys.maxsize > 2**32)'
('7fffffffffffffff', True)
sys.maxsize
был введен в Python 2.6. Если вам нужен тест для старых систем, этот немного более сложный тест должен работать на всех версиях Python 2 и 3:
$ python-32 -c 'import struct;print( 8 * struct.calcsize("P"))'
32
$ python-64 -c 'import struct;print( 8 * struct.calcsize("P"))'
64
Кстати, у вас может возникнуть соблазн использовать для этого platform.architecture ()
. К сожалению, его результаты не всегда надежны, особенно в случае универсальных двоичных файлов OS X .
$ arch -x86_64 /usr/bin/python2.6 -c 'import sys,platform; print platform.architecture()[0], sys.maxsize > 2**32'
64bit True
$ arch -i386 /usr/bin/python2.6 -c 'import sys,platform; print platform.architecture()[0], sys.maxsize > 2**32'
64bit False
platform.architecture()
является проблематичным (и дорогим).
Удобно тест для sys.maxsize > 2**32
начиная с Py2.6.
Это - надежный тест для фактического размера указателя (по умолчанию) и совместимый, по крайней мере, начиная с Py2.3: struct.calcsize('P') == 8
. Также: ctypes.sizeof(ctypes.c_void_p) == 8
.
Примечания: могут быть сборки с gcc опцией -mx32
или так, которые являются приложениями архитектуры на 64 бита, но используют указатели на 32 бита в качестве значения по умолчанию (сохранение памяти и скорости). 'sys.maxsize = ssize_t' не может строго представить размер указателя C (обычно 2**31 - 1
так или иначе). И были системы, которые имеют различные размеры указателя для кода и данных, и нужно разъяснить, какова точно цель различить "режим на 64 бита или на 32 бита?"
В основном вариант ответа Мэтью Маршалла (со структурой из std.library):
import struct
print struct.calcsize("P") * 8
Попробуйте использовать ctypes, чтобы получить размер пустого указателя:
import ctypes
print ctypes.sizeof(ctypes.c_voidp)
Будет 4 для 32-битных или 8 для 64-битных.
Для непрограммного решения посмотрите в Activity Monitor. В нем архитектура 64-битных процессов указана как «Intel (64-бит)».