使用BeautifulSoup在标记内提取文本

时间:2016-09-05 03:49:18

标签: python html text tags 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>

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

3 个答案:

答案 0 :(得分:1)

您无需搜索每个代码,您可以找到text="GENDER"所在的范围,并将父级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'

答案 1 :(得分:0)

您可以使用.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'

答案 2 :(得分:0)

这是一种更简单的理解方式:您可以通过解析&#34; p&#34;来获得所需的输出。标签。

Cantonese
English
Putonghua
Male

这将为您提供每个&#34; p&#34;标签的输出,如下所示

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

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

Male

将提供输出:

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

说明:

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>]

这将返回一个ResultSet - 基本上是一个ptags列表。在您的情况下,每个ptag都有两个元素span标记和字符串。

for ptag in ptags:
    print ptag.contents

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

[<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

输出:

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

仅打印第4个ptags

Male

输出:

error_reporting(0);