2017-03-17 26 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 + ']')