0

假设我们有代码:

 <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 制作列表以在“样式”属性中找到“左”的最高值,记住我不想考虑跨度与 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:.')})
4

1 回答 1

0
>>> import bs4
>>> HTML = open('temp.htm').read()
>>> soup = bs4.BeautifulSoup(HTML, 'lxml')

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

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

在每种情况下element['class'],都将是class元素中的项目列表,即,在这个 HTML 的情况下,或者只是foofoo和。Kung因此,对长度的测试是对单独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元素,然后寻找elementswith 类foo。和以前一样,只考虑那些只有 classfoo而不是既foo和的元素Kung。为这些元素收集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]
于 2017-08-30T22:06:35.187 回答