我正在使用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应该是一件简单的事情。
我真的很乐意帮助你
答案 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
也许有一种清洁或更美丽的方法,但我不认为这是丑陋的吗?