簡體   English   中英

使用BeautifulSoup提取標簽內的文本

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM