2017-06-25 13 views
-2

私はPythonで削り取りを実践しています(私は初心者です)、この擦り切れ問題を抱えていました。私はBillboard Hot 100から曲のリストを掻き取ろうとしていましたが、結果は私が必要としていたものより少なかったです。Billboard Hot 100掻き上げ問題

ここにコードがあります。ご覧のとおり、私は曲を辞書に保存してから印刷しています。 lxmlのインポートHTML インポート要求 ページ= requests.get( 'http://www.billboard.com/charts/hot-100')から ツリー= html.fromstring(page.content) 看板= {}

for x in range(1, 51): 

currSongY = '//*[@id="main"]/div[2]/div/div[1]/article[' + str(x) + ']/div[1]/div[4]/div[3]/div/h2/text()' 
currArtistY = '//*[@id="main"]/div[2]/div/div[1]/article[' + str(x) + ']/div[1]/div[4]/div[3]/div/a/text()' 

currSongX = tree.xpath(currSongY) 
currArtistX = tree.xpath(currArtistY) 

if currArtistX == '[]' and currSongX == '[]': 
    currSongY = '//*[@id="main"]/div[2]/div/div[1]/article[' + str(x) + ']/div[1]/div[3]/div[3]/div/h2/text()' 
    currArtistY = '//*[@id="main"]/div[2]/div/div[1]/article[' + str(x) + ']/div[1]/div[3]/div[3]/div/a/text()' 
    currSongX = tree.xpath(currSongY) 
    currArtistX = tree.xpath(currArtistY) 

    if currArtistX == '[]' and currSongX == '[]': 
     currSongY = '//*[@id="main"]/div[2]/div/div[1]/article[' + str(x) + ']/div[1]/div[2]/div[3]/div/h2/text()' 
     currArtistY = '//*[@id="main"]/div[2]/div/div[1]/article[' + str(x) + ']/div[1]/div[2]/div[3]/div/a/text()' 
     currSongX = tree.xpath(currSongY) 
     currArtistX = tree.xpath(currArtistY) 

currSong = str(currSongX)[2:(len(str(currSongX))-2)] 
#currArtist = str(currArtistX)[4:(len(str(currArtistX))-4)] 
currArtist = str(currArtistX).replace("\\n","") 
billboard[x] = (currSong, currArtist) 

print (billboard) 

ここでの結果は次のとおり

 
> {1: ('Despacito', "['Luis Fonsi & Daddy Yankee Featuring Justin Bieber']"), 2: ('', '[]'), 3: ('', '[]'), 4: ('', '[]'), 5: ('', '[]'), 6: ('', '[]'), 7: ('', '[]'), 8: ('', '[]'), 9: ('', '[]'), 10: ('', '[]'), 11: ('', '[]'), 12: ('', '[]'), 13: ('', '[]'), 14: ('', '[]'), 15: ('', '[]'), 16: ('', '[]'), 17: ('', '[]'), 18: ('', '[]'), 19: ('', '[]'), 20: ('', '[]'), 21: ('', '[]'), 22: ('', '[]'), 23: ('Bad Liar', "['Selena Gomez']"), 24: ('', '[]'), 25: ('', '[]'), 26: ('', '[]'), 27: ('', '[]'), 28: ('', '[]'), 29: ('', '[]'), 30: ('', '[]'), 31: ('', '[]'), 32: ('', '[]'), 33: ('', '[]'), 34: ('', '[]'), 35: ('', '[]'), 36: ('', '[]'), 37: ('Everyday We Lit', "['YFN Lucci Featuring PnB Rock']"), 38: ('', '[]'), 39: ('', '[]'), 40: ('', '[]'), 41: ('', '[]'), 42: ('', '[]'), 43: ('', '[]'), 44: ('', '[]'), 45: ('', '[]'), 46: ('', '[]'), 47: ('', '[]'), 48: ('', '[]'), 49: ('', '[]'), 50: ('', '[]')} 
>>> 

お気軽にお問い合わせください!!!!!

+0

ようこそスタックオーバーフロー。あなたの期待する結果は何ですか? – TomServo

答えて

0

HTMLをナビゲートするときに、パーサがあなたの仕事の一部をするようにするのが最善です。要素ツリーを生成し、ツリー内のタグと属性を探します。

次のコードでは、看板100のために私の作品:

from lxml import etree 
from io import StringIO 
import requests 

page = requests.get('http://www.billboard.com/charts/hot-100') 
html = etree.HTML(page.content) 

parser = etree.HTMLParser() 
tree = etree.parse(StringIO(unicode(etree.tostring(html))), parser) 
root = tree.getroot() 

billboard = [] 
for article in root.iter('article'): 
    if ('data-songtitle' in article.attrib): 
     currSong = article.attrib['data-songtitle'] 
     for item in article.iter('a'): 
      if (('class' in item.attrib) and (item.attrib['class'] == 'chart-row__artist')): 
       currArtist = item.text 
       billboard.append((currSong.strip(), currArtist.strip())) 
       break 

for entry in billboard: 
    print entry 

・ホープ、このことができます。

関連する問題