【问题标题】:How do I parse maximum number of a formated div value? BS4如何解析格式化 div 值的最大数量? BS4
【发布时间】:2020-07-14 20:28:51
【问题描述】:

我想为使用伪表格视图应用程序的网站创建解析器。问题是如何解析以特定方式格式化的cid

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>

我不知道如何处理。我可以使用列表推导来剥离和解析所有数字值并将它们写在列表中,然后获取列表的最大值,但在这种情况下它不会工作。数据中有很多外部数字。

【问题讨论】:

    标签: python html parsing beautifulsoup


    【解决方案1】:

    您可以在cid= 参数中将soup.find_all() 与自定义正则表达式一起使用,然后将其与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
    

    【讨论】:

    • @harryhow re.search(r'R(\d+)C\d+', some_text).group(1) 将获得第一个 () 组,在这种情况下 (\d+) 是 R 字符后的数字。
    【解决方案2】:

    如果您知道列数,那么您可以只计算具有 cid 属性的 div(即表示 table 的所有 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) 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-03-31
      • 2016-05-27
      • 1970-01-01
      • 1970-01-01
      • 2021-01-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多