Python - 解析HTML列表并从中创建一个JSON数组

时间:2017-03-17 12:55:51

标签: python html json parsing lxml

我正在使用Flask创建一个restful API,并尝试解析一个看起来像这样的HTML的公开方法之一:

<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来管理。

我不确定我是否在正确的道路上,或者我应该尝试一种完全不同的方法。我想首先获取文本值,然后创建dict或json应该是一件简单的事情。

我真的很乐意帮助你

2 个答案:

答案 0 :(得分: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 + ']')

答案 1 :(得分:0)

伙计们,感谢您的帮助。我是SO的新手,所以如果需要请举报......

在使用Beautiful Soup进行一些测试后,我能够解决这个问题:

我首先分析了如何导航原型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))

#然后我将列表合并到使用zip

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

#最后我用json模块转储成json格式

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

也许有一种清洁或更美丽的方法,但我不认为这是丑陋的吗?

相关问题