2017-08-30 45 views
0

假设我们有一些代码:部分在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列表找到的“左”的最高值在“风格” ATTRS牢记我不想考虑与class_跨越“功夫”

期望的结果将是:

[70,False or NaN,99] 

我知道了我要的东西,如启动:

trs = soup.find_all('tr', attrs={"data-something": "1"}) 
List = list() 
find_all('span',{'style': re.compile(r'^left:.')}) 

回答

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

首先,选择所有那些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元素,然后查找elementsfoo类。像以前一样,只包括那些仅具有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] 
+0

非常感谢!并不完全是我所寻找的,但却给了正确的方向! – PerfectionQuest

+0

我的荣幸。我对你如何从HTML获得'[70,False或NaN,99]'感到困惑。 –

+0

这是关于分离每个“tr”的“左”值并寻找最大值,所以如果第一个中有两个“左”,它应该带来更高的值。第二个没有有效的左边,所以False(或NaN,如果结果必须是整数),第三个将是99.这是我尝试解决的问题。数组的每个元素的最大值可能很容易,但使用'tr'来分散它们更加困难。 – PerfectionQuest