2017-03-17 57 views
0

林創建一個使用瓶和一個RESTful API,用於其暴露的方法之一,我試着去解析,看起來像這樣的HTML:的Python - 解析HTML列表並創建一個JSON陣列出來的

<li class="product some_product"> 
    <div class="product_wrap"> 
    <div class="basic_stat product_title"> 
    <a href="/product/type/title1"> 
    The Never Ending Story 
    </a> 
    </div> 
    <div class="basic_stat product_score score"> 
    <div class="score_w"> 
    100 
    </div> 
    </div> 

它爲其他20種不同的標題重複相同的格式。我試着去創建一個JSON結構出的這些,將看起來像

[{"Title": "The Never Ending Story", "Score": "100"}...]等等....

對於這一點,我測試BeautifulSoup導航HTML:

my_list = BeautifulSoup(html) 
>>> my_list.find_all("div", text=lambda text: text and "score_w" in text) 
[] 

給出例如,我是一個空數組。

如何僅過濾需要的行(文本),而不在每行的開始處留出任何空格?就是這一點,是給我一些頭痛的唯一部件....

,如:

The Never Ending Story 

100 

Titanic 

80 

Jurassic World 

70 

我可以轉化成JSON自己事後管理。

林不知道如果我在正確的道路上,或者我應該嘗試一種完全不同的方法。我想先得到這樣的文本值,然後創建字典或JSON應該是一件簡單的事情。

我真的appreaciate你的幫助

+0

僅對您發出警告,要求提供廣泛建議的問題在技術上被認爲是脫離主題,因此可能會被標記爲結果。 – Feathercrown

+0

哎呀,抱歉不能肯定這將被認爲是「廣泛的建議」,實際上是作爲一個海報的新的stackoverflow。當我進一步測試並接近我的目標時,我會回來 - 對不起。 – geekiechic

+0

@geekiechic你能粘貼更多的HTML嗎?我需要查看幾種產品的結構才能夠幫助您。 –

回答

0

傢伙感謝你的幫助。我是新來的,從而海報,請標誌,如果需要......

我能一些測試與美麗的湯這樣以後解決此問題:

我分析瞭如何首先導航大馬力的HTML,然後我既提取的標題和得分創建兩個單獨的列表

titles, scores = [],[] 
for line in movies_html.findAll('a'): 
    titles.append(line.getText(strip=True)) 

for line in movies_html.findAll('div', class_="basic_stat product_score"): 
    scores.append(line.getText(strip=True)) 

#然後我用拉鍊

result= [ { "title": str(t), "score": int(s) } for t, s in zip(titles, scores) ] 

#,終於合成了列表成爲類型的字典列表我用JSON模塊來轉儲到JSON格式

json = jsom.dumps(result, indent=2) 
return json 

也許有一個乾淨-ER或更漂亮的方法,但我不認爲這是一個醜陋的關係嗎?

0
#!/usr/bin/python3 
#========================================================== 

titles = 'movies.html' 

defaultDir = 'C:\\Users\\geekiechic\\Documents\\' ## win 
# defaultDir = '/home/eli/Documents/' ## linux 
##========================================================= 

movies = [] 

with open((defaultDir + titles), 'r') as data: 
    even = -1 
    for line in data: 
     if not line .lstrip() .startswith('<'): 
      even += 1 
      if even % 2 == 0: 
       movies += ("{'Title': '%s" % line.strip()) 
      else: 
       movies += ("', 'Score': '%s'}," % line.strip()) 

output = '' .join(movies) .rstrip(',') 
print('[' + output + ']')