在Python中使用BeautifulSoup从html提取数据

时间:2019-03-13 14:54:13

标签: python html beautifulsoup

我试图使用beautifulSoup从网站中提取数据。我想从此HTML代码段中提取数据

<ul class="result-info info-bro-6 cc" style="display: block;">
            <li>
                <strong>MODERATED</strong>
                <ul class="cc">
                        <li>
Health                        </li>
                        <li>
C****                        </li>
                        <li>
C*******                        </li>
                        <li>
D****                        </li>
                        <li>
Di8****                        </li>
                        <li>
Di****                        </li>
                        <li>
F*******                        </li>
                        <li>
Fi******                       </li>
                        <li>
L******                       </li>
                        <li>
M****                        </li>
                        <li>
NM*****                        </li>
                        <li>
P******                        </li>
                        <li>
Pr*****                        </li>
                        <li>
Sp****                        </li>
                        <li>
*******e                        </li>
                </ul>
            </li>

                    <li>
                <strong>
                    *********
                </strong>
                <ul class="cc">
                        <li>***   /****</li>
                </ul>
            </li>
            </ul>

我要提取的数据是“ *** / ****”。我希望我的代码仅返回此内容,但是我目前拥有的代码将返回li标记内的所有数据。我怎样才能只提取我想要的数据?

这是我当前的代码:

from bs4 import BeautifulSoup
import requests

html = """<ul class="result-info info-bro-6 cc" style="display: block;">
            <li>
                <strong>H*******</strong>
                <ul class="cc">
                        <li>
H*****                        </li>
                        <li>
C****                        </li>
                        <li>
C*******                        </li>
                        <li>
D****                        </li>
                        <li>
Di*****                        </li>
                        <li>
Di****                        </li>
                        <li>
F*******                        </li>
                        <li>
Fi******                       </li>
                        <li>
L******                       </li>
                        <li>
M****                        </li>
                        <li>
NM*****                        </li>
                        <li>
P******                        </li>
                        <li>
Pr*****                        </li>
                        <li>
Sp****                        </li>
                        <li>
*******e                        </li>
                </ul>
            </li>

                    <li>
                <strong>
                    *********
                </strong>
                <ul class="cc">
                        <li>***   /****</li>
                </ul>
            </li>
            </ul>"""


soup = BeautifulSoup(html)
for ultag in soup.find_all('ul', {'class': 'cc'}):
    for litag in ultag.find_all('li'):
             print(litag.text)

2 个答案:

答案 0 :(得分:0)

您已经注意到,有一堆ul带有class=cc的标签。您需要在HTML中找到一个一致性,使您可以同时抓取一个和一个。

例如,您想要的ul标记是HTML中的最后一个标记。因此,无需遍历所有ul标签,只需获取最后一个标签即可:

ultag = soup.find_all('ul', {'class':'cc'})[-1]
litag = ultag.li
print(litag.text)

不幸的是,如果由于稍后HTML代码中包含更多ul标签而导致此操作不起作用,那么您将需要使导航更加具体。


如果它是类ul中的最后一个result-info info-bro-6 cc,那么这可能会有所帮助:

outer_ul = soup.select_one('ul.result-info.info-bro-6.cc')
last_ul = outer_ul.find_all('ul')[-1]
print(last_ul.text)

答案 1 :(得分:0)

您可以使用next查找该标签的下一个兄弟

soup = BeautifulSoup(html, 'html.parser')
data = soup.findAll('ul', attrs={'class':'cc'})[2].next.next.text
print(data)