Как мне проанализировать максимальное количество форматированного значения div? BS4 - PullRequest
1 голос
/ 14 июля 2020

Я хочу создать парсер для веб-сайта, который использует приложение для просмотра псевдотаблиц. Вопрос в том, как анализировать cid, который сформирован определенным образом c.

cid имеют две отформатированные переменные R (row) и C (column). Например, cid="R1C1" означает строку №1 и столбец №1 в данных. Я хочу получить максимальное значение строк. Итак, в данном случае 99.

Пример данных

<div align="center" ccnt="1" cid="R1C1"><div rid="v"><span rv="1">1</span></div></div>
<div align="center" ccnt="1" cid="R1C2"><div rid="v"><span rv="1970">1970</span></div></div>
<div ccnt="1" cid="R1C3"><div rid="v">No Name</div></div>
<div ccnt="1" cid="R1C4"><div rid="v">New York</div></div>

...

<div align="center" ccnt="1" cid="R99C1"><div rid="v"><span rv="99">99</span></div></div>
<div align="center" ccnt="1" cid="R99C2"><div rid="v"><span rv="2020">2020</span></div></div>
<div ccnt="1" cid="R99C3"><div rid="v">No Name</div></div>
<div ccnt="1" cid="R99C4"><div rid="v">Iraq</div></div>

Я не знаю, как с этим справиться. Я мог бы использовать понимание списка, чтобы разделить и проанализировать все значения di git и записать их в список и получить максимальное значение списка, но в этом случае это не сработает. В данных много внешних цифр.

Ответы [ 2 ]

1 голос
/ 14 июля 2020

Вы можете использовать soup.find_all() с настраиваемым регулярным выражением в параметре cid=, а затем объединить его с функцией max().

Например:

import re
from bs4 import BeautifulSoup


txt = '''<div align="center" ccnt="1" cid="R1C1"><div rid="v"><span rv="1">1</span></div></div>
<div align="center" ccnt="1" cid="R1C2"><div rid="v"><span rv="1970">1970</span></div></div>
<div ccnt="1" cid="R1C3"><div rid="v">No Name</div></div>
<div ccnt="1" cid="R1C4"><div rid="v">New York</div></div>

<div align="center" ccnt="1" cid="R99C1"><div rid="v"><span rv="99">99</span></div></div>
<div align="center" ccnt="1" cid="R99C2"><div rid="v"><span rv="2020">2020</span></div></div>
<div ccnt="1" cid="R99C3"><div rid="v">No Name</div></div>
<div ccnt="1" cid="R99C4"><div rid="v">Iraq</div></div>'''


soup = BeautifulSoup(txt, 'html.parser')

r = re.compile(r'R(\d+)C\d+')
max_row = max(int(r.search(div['cid']).group(1)) for div in soup.find_all(cid=r))
print(max_row)

Печать:

99
0 голосов
/ 14 июля 2020

Если вы знаете количество столбцов, вы можете просто подсчитать div с атрибутами cid (то есть все div, представляющие таблицу) и разделить его на количество столбцов

Или вы можете сделать это

    def getRowNo(cid):
        '''
        R99C3.split('C') => ['R99', '3' ] 
        ['R99', '3' ][0][1:]  => '99'
        '''
        return int(cid.split('C')[0][1:])

    rownos = [ getRowNo(div['cid'] ) for div in soup.find_all( 'div', cid=True)] 

    Max_row = max(rownos) 
...