Как вы можете использовать BeautifulSoup для получения чисел colindex?

Около недели назад у меня была проблема. Поскольку я считаю, что решение было классным, я делюсь им здесь, пока жду ответа на вопрос, который я разместил ранее. Мне нужно знать относительное положение заголовков столбцов в таблице, чтобы я знал, как сопоставить заголовок столбца с данными в строках ниже. Я обнаружил, что в некоторых из моих таблиц следующая строка была первой строкой в ​​таблице

<!-- Table Width Row -->
<TR style = "font-size: 1pt" valign = "bottom">
<TD width = "60%">&nbsp;</TD> <!-- colindex=01 type=maindata -->
<TD width = "1%">&nbsp;</TD>  <!-- colindex=02 type=gutter -->
<TD width = "1%" align = "right">&nbsp;</TD>    <!-- colindex=02 type=lead -->
<TD width = "9%" align = "right">&nbsp;</TD>    <!-- colindex=02 type=body -->
<TD width = "1%" align = "left">&nbsp;</TD> <!-- colindex=02 type=hang1 -->

<TD width = "3%">&nbsp;</TD>  <!-- colindex=03 type=gutter -->
<TD width = "1%" align = "right">&nbsp;</TD>    <!-- colindex=03 type=lead -->
<TD width = "4%" align = "right">&nbsp;</TD>    <!-- colindex=03 type=body -->
<TD width = "1%" align = "left">&nbsp;</TD> <!-- colindex=03 type=hang1 -->
<TD width = "3%">&nbsp;</TD>  <!-- colindex=04 type=gutter -->
<TD width = "1%" align = "right">&nbsp;</TD>    <!-- colindex=04 type=lead -->

<TD width = "4%" align = "right">&nbsp;</TD>    <!-- colindex=04 type=body -->
<TD width = "1%" align = "left">&nbsp;</TD> <!-- colindex=04 type=hang1 -->
<TD width = "3%">&nbsp;</TD>  <!-- colindex=05 type=gutter -->
<TD width = "1%" align = "right">&nbsp;</TD>    <!-- colindex=05 type=lead -->
<TD width = "5%" align = "right">&nbsp;</TD>    <!-- colindex=05 type=body -->
<TD width = "1%" align = "left">&nbsp;</TD> <!-- colindex=05 type=hang1 -->

 </TR>

Я подумал, вау, это будет легко, потому что данные находятся в столбце ниже type = body. Отсчет я знал, что в строках данных мне нужно будет получить значения в столбцах [3, 7, 11, 15]. Поэтому я решил добиться этого с помощью этого кода:

indexComment = souptoGetColIndex.findAll(text=re.compile("type=body"))
indexRow=indexComment[0].findParent()
indexCells=indexRow.findAll(text=re.compile("type=body"))
for each in range(len(indexCells)):
    collist.append(tdlist.index(indexCells[each].previousSibling.previousSibling))

я получил коллист = [0, 3, 7, 7, 15]

Оказывается, я думаю, что поскольку ячейки на 7-й и 11-й позициях выглядели точно так же, была возвращена одна и та же позиция индекса. Я пытался понять, как с этим справиться, очевидно, что мне нужно было заставить их выглядеть по-другому. Поэтому я заставил их выглядеть по-другому, сначала используя строки чтения для чтения каждой строки файла и заменив пробелы на случайное целое число.

for each in toGetColIndex:
   newlt.append(each.replace(r"&nbsp;",str(random.randint(1,14567))))

друг указал, что я могу снизить накладные расходы, используя вместо этого

for each in toGetColIndex:
   newlt.append(each.replace(r"&nbsp;",str(toGetColIndex.index(each))))

Тем не менее, каждый из этих подходов дает мне список с colindex для расположения моих заголовков для каждого столбца и для использования в строках данных. Обратите внимание, что в функции замены отсутствует пустое пространство, поскольку я предполагаю, что HTML вызывает его исчезновение, в фактическом коде используется r "&. N.b.s.p;" без периодов

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
825
1

Ответы 1

Приведенный ниже код создает [3, 7, 11, 15], что, как я понимаю, вы ищете

from BeautifulSoup import BeautifulSoup
from re import compile

soup = BeautifulSoup(
    '''<HTML><BODY>
    <TABLE>
    <TR style = "font-size: 1pt" valign = "bottom">
    <TD width = "60%"> </TD> <!-- colindex=01 type=maindata -->
    <TD width = "1%"> </TD>  <!-- colindex=02 type=gutter -->
    <TD width = "1%" align = "right"> </TD>    <!-- colindex=02 type=lead -->
    <TD width = "9%" align = "right"> </TD>    <!-- colindex=02 type=body -->
    <TD width = "1%" align = "left"> </TD> <!-- colindex=02 type=hang1 -->

    <TD width = "3%"> </TD>  <!-- colindex=03 type=gutter -->
    <TD width = "1%" align = "right"> </TD>    <!-- colindex=03 type=lead -->
    <TD width = "4%" align = "right"> </TD>    <!-- colindex=03 type=body -->
    <TD width = "1%" align = "left"> </TD> <!-- colindex=03 type=hang1 -->
    <TD width = "3%"> </TD>  <!-- colindex=04 type=gutter -->
    <TD width = "1%" align = "right"> </TD>    <!-- colindex=04 type=lead -->

    <TD width = "4%" align = "right"> </TD>    <!-- colindex=04 type=body -->
    <TD width = "1%" align = "left"> </TD> <!-- colindex=04 type=hang1 -->
    <TD width = "3%"> </TD>  <!-- colindex=05 type=gutter -->
    <TD width = "1%" align = "right"> </TD>    <!-- colindex=05 type=lead -->
    <TD width = "5%" align = "right"> </TD>    <!-- colindex=05 type=body -->
    <TD width = "1%" align = "left"> </TD> <!-- colindex=05 type=hang1 -->

     </TR>
    </TABLE> </BODY></HTML>'''
)

tables = soup.findAll('table')
matcher = compile('colindex')

def body_cols(row):
    for i, comment in enumerate(row.findAll(text=matcher)):
        if 'type=body' in comment:
            yield i

for table in soup.findAll('table'):
    index_row = table.find('tr')
    print list(body_cols(index_row))

Другие вопросы по теме