<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”但它不起作用。
答案 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);