[英]Extracting text within tag with 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>
我想在第五行中提取“男性”,但我不知道該怎么做。 有人可以幫忙嗎? 我嘗試了“ gen = soup.find('span',class _ ='tab')。string“,但它不起作用。
您無需搜索每個標簽,您可以找到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'
您可以使用.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'
這是讓您理解的一種更簡單的方法:您可以通過解析“ 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標簽和string。
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
僅打印第四個ptag
print ptags[3].contents[1].string.strip()
輸出:
Male
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.