【问题标题】:Part of value inside of 'style' attrs to become variable in python bs4'style' attrs 内的部分值在 python bs4 中变为变量
【发布时间】:2017-08-30 20:58:13
【问题描述】:

假设我们有代码:

 <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' attrs 中找到 '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:.')})

【问题讨论】:

    标签: python web-scraping bs4 attrs.xml


    【解决方案1】:
    >>> import bs4
    >>> HTML = open('temp.htm').read()
    >>> soup = bs4.BeautifulSoup(HTML, 'lxml')
    

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

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

    在每种情况下,element['class'] 将是 class 中元素的项目列表,即在此 HTML 的情况下只是 foofooKung。因此,对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 元素,然后查找类为 fooelements。和以前一样,只考虑那些只有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]
    

    【讨论】:

    • 非常感谢!不完全是我一直在寻找的东西,但它极大地推动了正确的方向!
    • 我的荣幸。我很困惑你如何从那个 HTML 中得到 [70,False or NaN,99]
    • 这是关于分离每个 'tr' 的 'left' 值并在其中寻找最大值,所以如果第一个有两个 'lefts' 它应该带来更高的值。第二个没有有效的左边,所以 False(如果结果必须是整数,则为 NaN),第三个将是 99。这是我试图解决的问题。数组的每个元素的最大值可能很容易,但用 'tr' 将它们多样化更难。
    • 某种 .parent 比较器可能是一个解决方案。
    • 太棒了!这是我无法处理的部分;)再次感谢您!
    猜你喜欢
    • 2017-04-12
    • 2021-04-24
    • 1970-01-01
    • 2021-05-10
    • 2012-08-18
    • 2021-12-01
    • 2019-07-08
    • 2021-11-19
    • 2012-09-11
    相关资源
    最近更新 更多