簡體   English   中英

我需要使用html頁面中的python提取一些數據

[英]I need to extract some data using python from a html page

這是html頁面的一部分,我需要從中提取以下各項:強烈標記的名稱,分類類型(演員和歌手),生死地點。

<li class="clearfix">
   <div style="margin-top:10px;">
      <div class="float-left" style="margin-bottom:10px;">
         <a href="http://" title="Elvis Presley" name="Elvis Presley" class="float-left">
         <strong>Mr. Elvis Presley</strong></a>
      </div>
      <div class="rating_overall fleft" style="margin:0px 0px 0px 10px;">
         <div class="rating_overall voted_rating_overall" style='width:72.96px;'></div>
      </div>
      <span class="result-vote float-left" id="result" style="line-height:15px; color: #AAA; font-size: 0.9em; margin-top: 1px;"> &nbsp; (15 vots)</span>
      <div class="clear"></div>
      <a href="http://" title="Mr. Elvis Presley" name="Mr. Elvis Presley">
      <img style="float:left;" src="http://a.jpg" alt="Mr. Elvis Presley" title="Mr. Elvis Presley"  />
      </a>
      <br/>
      <p>
         <b>Classification:</b>
         <a href="http://" title="Actor " name="Actor " class="underline">Actor </a>
         ,                      <a href="" title="Singer" name="Singer" class="underline">Singer</a>
         <br />
         <b>Born:</b> <a href="http://" title="Tupelo" name="Tupelo" class="underline">Tupelo</a><br />
         <b>Died:</b>
         Memphis,
         <!--<b>City:</b>-->
         <a href="http://" title="Memphis" name="Memphis" class="underline">Memphis</a>
      </p>
      <div class="clk"></div>
   </div>
</li>

我曾嘗試使用BeautifulSoup,但我是python的新手:

    data2 = soup.find_all('li',{'class':'clearfix'})

for container in data2:
    if container.find('a', {'class':'float-left'}):
        name = container.a.text
        print (name)

    if container.find('a', {'class':'underline'}):
        classification=container.div.p.a.text
        print (classification)


flag

盡管我沒有從腳本中得到任何錯誤,但是我設法僅提取名稱和第一個分類。 如何確定我需要的其余要素:分類(“歌手”)以及出生和死亡的地點?

您可以將漂亮的湯用於html解析器,我首先向您展示漂亮的湯,再向您展示正則表達式,然后通過組捕獲來捕獲結果:

首先搭配美麗的湯:

string_1="""<li class="clearfix">
   <div style="margin-top:10px;">
      <div class="float-left" style="margin-bottom:10px;">
         <a href="http://" title="Elvis Presley" name="Elvis Presley" class="float-left">
         <strong>Mr. Elvis Presley</strong></a>
      </div>
      <div class="rating_overall fleft" style="margin:0px 0px 0px 10px;">
         <div class="rating_overall voted_rating_overall" style='width:72.96px;'></div>
      </div>
      <span class="result-vote float-left" id="result" style="line-height:15px; color: #AAA; font-size: 0.9em; margin-top: 1px;"> &nbsp; (15 vots)</span>
      <div class="clear"></div>
      <a href="http://" title="Mr. Elvis Presley" name="Mr. Elvis Presley">
      <img style="float:left;" src="http://a.jpg" alt="Mr. Elvis Presley" title="Mr. Elvis Presley"  />
      </a>
      <br/>
      <p>
         <b>Classification:</b>
         <a href="http://" title="Actor " name="Actor " class="underline">Actor </a>
         ,                      <a href="" title="Singer" name="Singer" class="underline">Singer</a>
         <br />
         <b>Born:</b> <a href="http://" title="Tupelo" name="Tupelo" class="underline">Tupelo</a><br />
         <b>Died:</b>
         Memphis,
         <!--<b>City:</b>-->
         <a href="http://" title="Memphis" name="Memphis" class="underline">Memphis</a>
      </p>
      <div class="clk"></div>
   </div>
</li>"""

from bs4 import BeautifulSoup
soup=BeautifulSoup(string_1,"html.parser")
for a in soup.find_all('a'):
    print(a['name'])

輸出:

Elvis Presley
Mr. Elvis Presley
Actor 
Singer
Tupelo
Memphis

用正則表達式第二:

如果表單代碼與您在此處顯示的相同,請使用它:

import re
string_1="""<li class="clearfix">
   <div style="margin-top:10px;">
      <div class="float-left" style="margin-bottom:10px;">
         <a href="http://" title="Elvis Presley" name="Elvis Presley" class="float-left">
         <strong>Mr. Elvis Presley</strong></a>
      </div>
      <div class="rating_overall fleft" style="margin:0px 0px 0px 10px;">
         <div class="rating_overall voted_rating_overall" style='width:72.96px;'></div>
      </div>
      <span class="result-vote float-left" id="result" style="line-height:15px; color: #AAA; font-size: 0.9em; margin-top: 1px;"> &nbsp; (15 vots)</span>
      <div class="clear"></div>
      <a href="http://" title="Mr. Elvis Presley" name="Mr. Elvis Presley">
      <img style="float:left;" src="http://a.jpg" alt="Mr. Elvis Presley" title="Mr. Elvis Presley"  />
      </a>
      <br/>
      <p>
         <b>Classification:</b>
         <a href="http://" title="Actor " name="Actor " class="underline">Actor </a>
         ,                      <a href="" title="Singer" name="Singer" class="underline">Singer</a>
         <br />
         <b>Born:</b> <a href="http://" title="Tupelo" name="Tupelo" class="underline">Tupelo</a><br />
         <b>Died:</b>
         Memphis,
         <!--<b>City:</b>-->
         <a href="http://" title="Memphis" name="Memphis" class="underline">Memphis</a>
      </p>
      <div class="clk"></div>
   </div>
</li>"""
pattern=r'<strong>(\w.+)<\/strong>|<b>Classification:<\/b>(\s.+)(\s.+)|(Born:.+)|(Died:.+\s.+\s.+\s.+)'
pattern_2=r'name=["](\w.+?)["]'


match=re.finditer(pattern,string_1,re.M)
for find in match:
    if find.group(1):
        print("Name {}".format(find.group(1)))
    if find.group(2):
        print("Classificiation first {}".format(re.search(pattern_2,str(find.group(2))).group(1)))
        print("Classification second {}".format(re.search(pattern_2,str(find.group(3))).group(1)))
    if find.group(4):
        print("Born {}".format(re.search(pattern_2, str(find.group(4))).group(1)))
    if find.group(5):
        print("Dead {}".format(re.search(pattern_2, str(find.group(5))).group(1)))

輸出:

Name Mr. Elvis Presley
Classificiation first Actor 
Classification second Singer
Born Tupelo
Dead Memphis

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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