'style' attrs 中的部分值在 python bs4 中变为变量

Part of value inside of 'style' attrs to become variable in python bs4

假设我们有代码:

 <tr class=" " somethingc1="" somethingc2="" somethingc3="" data-something="1" something="1something4" something_id="6something7">
 <td class="text-center td_something">
 <div>
 <span doo="true" class="foo" style="left:70%;z-index:99;">
 <span doo="true" class="foo" style="left:50%;z-index:90;">
 <span doo="true" class="Kung foo" style="left:90%;z-index:95;">
 </div>
 </td>
 </tr>
 <tr class=" " somethingc1="" somethingc2="" somethingc3="" data-something="1" something="1something4" something_id="6something7">
 <td class="text-center td_something">
 <div>
 <span doo="true" class="Kung foo" style="left:35%;z-index:95;">
 </div>
 </td>
 </tr>
 <tr class=" " somethingc1="" somethingc2="" somethingc3="" data-something="1" something="1something4" something_id="6something7">
 <td class="text-center td_something">
 <div>
 <span doo="true" class="foo" style="left:99%;z-index:100;">
 </div>
 </td>
 </tr>

我如何使用 Python 中的 Bs4 制作一个列表来找到 'style' 属性中 'left' 的最大值,记住我不想考虑跨度与 class_ "Kung"

期望的结果是:

[70,False or NaN,99]

我明白了,我应该从以下内容开始:

trs = soup.find_all('tr', attrs={"data-something": "1"})
List = list()
find_all('span',{'style': re.compile(r'^left:.')})
>>> import bs4
>>> HTML = open('temp.htm').read()
>>> soup = bs4.BeautifulSoup(HTML, 'lxml')

首先,select class 包含 foo 的所有元素(无论它是否还包含其他内容)。

>>> elements = soup.select('.foo')

在每种情况下,element['class'] 将是元素的 class 中的项目列表,即只是 foofooKung 在这种情况下 HTML。因此,对 element['class'] 长度的测试是对 foo 单独存在的测试。

element['style'] 获取元素的 style 的内容。对我们想要的部分使用正则表达式,并将其添加到名为 lefts.

的列表中
>>> lefts = [ ]
>>> for element in elements:
...     if len(element['class'])==1:
...         lefts.append(int(bs4.re.search(r'left:([0-9]+)', element['style']).groups(0)[0]))
... 
>>> 
>>> lefts
[70, 50, 99]

编辑:

找到 tr 个元素,然后用 class foo 寻找 elements。和以前一样,只考虑那些只有 class foo 而不是 fooKung 的元素。收集这些元素的 left 个样式元素,然后找到它们的最大值。

>>> HTML = open('temp.htm').read()
>>> import bs4
>>> soup = bs4.BeautifulSoup(HTML, 'lxml')
>>> trs = soup.findAll('tr')
>>> tr_max = []
>>> for tr in trs:
...     elements = tr.select('.foo')
...     lefts = [ ]
...     for element in elements:
...         if len(element['class'])==1:
...             lefts.append(int(bs4.re.search(r'left:([0-9]+)', element['style']).groups(0)[0]))
...     if lefts:
...         tr_max.append(max(lefts))
...     else:
...         tr_max.append(None)
... 
>>> tr_max
[70, None, 99]