【问题标题】:Extracting text within tag with BeautifulSoup使用 BeautifulSoup 提取标签内的文本
【发布时间】:2016-09-05 03:49:17
【问题描述】:
    <div>
<p class="tabbed" style="margin-top:2px;"><span class="tab"><strong>LANGUAGES</strong></span>Cantonese</p>
<p class="tabbed" style="margin-top:2px;"><span class="tab"></span>English</p>
<p class="tabbed" style="margin-top:2px;"><span class="tab"></span>Putonghua</p>
<p class="tabbed"><span class="tab"><strong>GENDER</strong></span>Male</p>
   </div>

我想提取第 5 行中的“男性”,但我不知道该怎么做。任何人都可以帮忙吗? 我试过“gen = soup.find('span', class_='tab').string”,但它不起作用。

【问题讨论】:

    标签: python html text tags beautifulsoup


    【解决方案1】:

    你不需要搜索每个标签,你可以找到text="GENDER"所在的span并从父p获取文本设置resursive=False只获取父文本:

    In [4]: from bs4 import BeautifulSoup
    
    In [5]: h = """<div>
       ...: <p class="tabbed" style="margin-top:2px;"><span class="tab"><strong>LANGUAGES</strong></span>Cantonese</p>
       ...: <p class="tabbed" style="margin-top:2px;"><span class="tab"></span>English</p>
       ...: <p class="tabbed" style="margin-top:2px;"><span class="tab"></span>Putonghua</p>
       ...: <p class="tabbed"><span class="tab"><strong>GENDER</strong></span>Male</p>
       ...:    </div>"""
    
    In [6]: soup = BeautifulSoup(h,"html.parser")
    
    In [7]: soup.find("span","tab", text="GENDER").parent.find(text=True,recursive=False)
    Out[7]: u'Male'
    

    或者只使用不带类名的跨度:

    In [8]: soup.find("span",text="GENDER").parent.find(text=True,recursive=False)
    Out[8]: u'Male'
    

    【讨论】:

      【解决方案2】:

      您可以使用.findAll() 方法:

      In [37]: from bs4 import BeautifulSoup
      
      In [38]: soup = BeautifulSoup("""<div>
           ...: <p class="tabbed" style="margin-top:2px;"><span class="tab"><strong>LANGUAGES</strong></span>Cantonese</p>
           ...: <p class="tabbed" style="margin-top:2px;"><span class="tab"></span>English</p>
           ...: <p class="tabbed" style="margin-top:2px;"><span class="tab"></span>Putonghua</p>
           ...: <p class="tabbed"><span class="tab"><strong>GENDER</strong></span>Male</p>
           ...:    </div>""", "html")
      
      In [39]: soup.find(lambda tag: tag.text.startswith('GENDER')).text[6:]
      Out[39]: u'Male'
      

      【讨论】:

      • 哇,非常感谢!!请问这里的“lambda tag”和“text[6:]”的功能/含义是什么?
      【解决方案3】:

      这里有一个更简单的理解方式:你可以通过解析“p”标签得到你想要的输出。

      from bs4 import BeautifulSoup
      
      doc = """ 
      <div>
      <p class="tabbed" style="margin-top:2px;"><span class="tab"><strong>LANGUAGES</strong></span>Cantonese</p>
      <p class="tabbed" style="margin-top:2px;"><span class="tab"></span>English</p>
      <p class="tabbed" style="margin-top:2px;"><span class="tab"></span>Putonghua</p>
      <p class="tabbed"><span class="tab"><strong>GENDER</strong></span>Male</p>
      </div>
      """
      
      soup = BeautifulSoup(doc, "lxml")
      
      ptags = soup.find_all("p", attrs={'class':'tabbed'})
      for ptag in ptags:
          print ptag.contents[1].string.strip()
      

      这将为您提供每个“p”标签的输出,如下所示

      Cantonese
      English
      Putonghua
      Male
      

      现在,如果您只想要第 4 个 ptag 的值,您可以用这一行替换上面的“for 循环”。假设您确定您总是想要第 4 个 ptag 的值,请执行以下操作

      print ptags[3].contents[1].string.strip()
      

      会给出输出:

      Male
      

      解释:

      ptags = soup.find_all("p", attrs={'class':'tabbed'})
      

      这会返回一个 ResultSet - 基本上是一个 ptag 列表。在您的案例中,每个 ptag 都有两个元素,即 span 标签和字符串。

      print ptags
      
      [<p class="tabbed" style="margin-top:2px;"><span class="tab"><strong>LANGUAGES</strong></span>Cantonese</p>, 
      <p class="tabbed" style="margin-top:2px;"><span class="tab"></span>English</p>, 
      <p class="tabbed" style="margin-top:2px;"><span class="tab"></span>Putonghua</p>, 
      <p class="tabbed"><span class="tab"><strong>GENDER</strong></span>Male</p>]
      

      现在对于每个 ptag,如果您打印其内容“ptag.contents”,它会返回标签中的元素列表 例如:

      for ptag in ptags:
          print ptag.contents
      

      将给予:

      [<span class="tab"><strong>LANGUAGES</strong></span>, u'Cantonese']
      [<span class="tab"></span>, u'English']
      [<span class="tab"></span>, u'Putonghua']
      [<span class="tab"><strong>GENDER</strong></span>, u'Male']
      

      现在你想要列表中的第二个元素,所以只需获取第二个元素

      for ptag in ptags:
          print ptag.contents[1].string.strip()
      

      输出:

      Cantonese
      English
      Putonghua
      Male
      

      仅打印第 4 个 ptags

      print ptags[3].contents[1].string.strip()
      

      输出:

      Male
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-06-16
        • 1970-01-01
        • 2016-03-27
        • 2017-12-05
        • 2020-11-14
        • 1970-01-01
        相关资源
        最近更新 更多