美丽的汤获得一定的段落

时间:2018-02-08 04:25:58

标签: python beautifulsoup

我试图从网站上获取某段文字,但我目前的方法无效。 我希望段落在底部。谢谢你的帮助,我为新手道歉。我试过阅读文档,但无法解读。

from bs4 import BeautifulSoup

import requests

url = "https://pwcs.edu/"

r  = requests.get(url)

data = r.text

soup = BeautifulSoup(data, "lxml")

container = soup.find("div",attrs={'class': 'alertWrapper'})
paragraph = container.find("p")

当我打印paragraph.getText()时,我得到了一堆空格但没有错误。

html是:

    <div id="page">
<div id="em-alerts" role="alert">
   <div class="alertWrapper">
      <div class="container">
         <span class="icon dom-bg">
            <em class="fa fa-bell">
               <!---->
            </em>
         </span>
         <span id="alert">ALERT</span>
         <p>All PWCS will open two hours late on Thursday, February 8, due to icy road conditions in certain areas. SACC will open two hours late. Parents always have the option to keep children home if they have safety concerns.
         </p>
         <p></p>
      </div>
   </div>
</div>

我希望段落在底部。谢谢你的帮助,我为新手道歉。我尝试阅读文档,但无法解读。

4 个答案:

答案 0 :(得分:1)

soup = BeautifulSoup(data, "lxml")

container = soup.find("div",attrs={'class': 'alertWrapper'})

paragraph = container.find("p")

在上面的代码中,您将只获得第一个&#34; p&#34;标签。 container.find(&#34; p&#34;)只为您提供第一个&#34; p&#34;标签

你得到的第一个标签是空的。 您可以查看该网站的页面来源。

但实际上容器有多个&#34; p&#34;标签。

您需要做的是:

for p in container.find_all("p"):
    print p.text

以下是您网站上 alertWrapper 课程中的Html内容。

<div class="alertWrapper">
    <div class="container"><span class="icon dom-bg"><em class="fa fa-bell"><!-- --></em></span>

        <!--First "p" tag which is empty-->

        <p>               
        </p>
        <table align="center" cellpadding="2" cellspacing="2" class="" style="border: 3px solid rgb(0, 176, 240);">
            <tbody>
            <tr>
                <td class=""
                    style="margin: 2px; padding: 2px; border-image-source: none; border-image-slice: initial; border-image-width: initial; border-image-outset: initial; border-image-repeat: initial; background-color: rgb(255, 255, 255);">
                    <ul>


                        <!--Second "p" tag which you want-->

                        <p style="text-align: left; margin-left: 120px;"><strong><span
                                style='font-size: medium; letter-spacing: normal; font-family: "Times New Roman"; color: rgb(0, 112, 192);'>The PWCS Parent Divisionwide surveys, sent on January 9, were unexpectedly delayed at the US Post Office distribution center. The deadline for the parent survey, both paper and online, has been extended to Friday, February 9, 2018. </span></strong>
                        </p>
                    </ul>
                </td>
            </tr>
            </tbody>
        </table>
    </div>
</div>

答案 1 :(得分:1)

如果右键单击并检查页面源,则所需的文本不可用。您提供的HTML与页面来源不匹配。

<div class="alertWrapper">
  <div class="container"><span class="icon dom-bg"><em class="fa fa-bell"><!----></em></span><p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
<table style="border: 3px solid rgb(0, 176, 240);" align="center" cellpadding="2" cellspacing="2" class="">
    <tbody>

这种情况正在发生,因为您想要的内容是由JavaScript动态生成的。您将无法使用requests模块进行删除。

您必须使用其他工具,例如Selenium

答案 2 :(得分:0)

截至目前,该页面上有多个带有“容器”类的div。因此,您可以使用find_all()方法而不是find()。例如,像这样:

from bs4 import BeautifulSoup
import requests
r  = requests.get("https://pwcs.edu/")
soup = BeautifulSoup(r.text, "lxml")

n = 0
for container in soup.find_all("div",attrs={'class': 'container'}):
    n += 1
    print('==',n,'==')
    for paragraph in container.find_all("p"):
        print(paragraph)

或者,您可以使用.next_sibling

for span in soup.find_all("span",attrs={'id': 'alert'}):
    if span.next_sibling:
        print('ALERT',span.next_sibling)

答案 3 :(得分:0)

首先,您可以尽可能接近段落:

container = soup.find('div', attrs={'class':'container'})

然后,您在容器中查找所有<p>标记并加入它们。

\n'.join([x.text for x in container.find_all('p') if x.text != ""])

这会将所有段落放在一起,如果它们不是空白,则每个段落之间用换行符链接。

<强>输出:

  由于冰冷,所有PWCS将于2月8日星期四晚两个小时开放   某些地区的道路状况。 SACC将延迟两小时开放。   父母总是可以选择让孩子回家   安全问题。\ n'