Как я определяю, выполняется ли моя оболочка Python в режиме на 64 бита или на 32 бита на OS X?

К вашему сведению (если вы хотите знать основную причину вашей проблемы) цель 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')

[ 1116] Однако в современных браузерах есть встроенные инструменты для «исправления» сломанных тегов, и поэтому в браузере table не выглядит «сломанным»: закрытие </div> добавляется к предку div, в то время как тег p превращается в пустой узел <p></p>

383
задан CharlesB 28 May 2013 в 22:38
поделиться

5 ответов

ОБНОВЛЕНО: Один из способов - посмотреть на 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
376
ответ дан 22 November 2019 в 23:53
поделиться

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 бита?"

0
ответ дан 22 November 2019 в 23:53
поделиться

В основном вариант ответа Мэтью Маршалла (со структурой из std.library):

import struct
print struct.calcsize("P") * 8
178
ответ дан 22 November 2019 в 23:53
поделиться

Попробуйте использовать ctypes, чтобы получить размер пустого указателя:

import ctypes
print ctypes.sizeof(ctypes.c_voidp)

Будет 4 для 32-битных или 8 для 64-битных.

72
ответ дан 22 November 2019 в 23:53
поделиться

Для непрограммного решения посмотрите в Activity Monitor. В нем архитектура 64-битных процессов указана как «Intel (64-бит)».

17
ответ дан 22 November 2019 в 23:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: