【发布时间】:2015-11-26 20:12:42
【问题描述】:
各位大侠,假设下面的html如何提取属于<h3>的图块<p>的段落。
<!DOCTYPE html>
<html>
<body>
...
<div class="main-div">
<h3>Title 1</h3>
<p></p>
<h3>Title 2</h3>
<p></p>
<p></p>
<p></p>
<h3>Title 3</h3>
<p></p>
<p></p>
...
</div>
</body>
如您所见,<h3> 和 <p> 标记都是 <div> 标记的子标记但它们没有类或 id 可以识别它们并说“标题 1 " 有 1 段,标题 2 有 3 段,标题 3 有 2 段,依此类推。我看不到将段落与标题联系起来的方法...
我正在尝试使用 Python 2.7 + selenium。但我不确定我使用的是正确的工具,也许您可以提出解决方案或任何不同的组合,如 Beautifulsoup、urllib2...
任何建议/方向将不胜感激!
更新
在@JustMe 指出的出色解决方案之后,我想出了下面的解决方案,希望它对其他人有所帮助,或者如果有人可以将其改进为 pythonic。我来自 c/c++/java/perl 世界,所以我总是碰壁:)
import bs4
page = """
<!DOCTYPE html>
<html>
<body>
...
<div class="maincontent-block">
<h3>Title 1</h3>
<p>1</p>
<p>2</p>
<p>3</p>
<h3>Title 2</h3>
<p>2</p>
<p>3</p>
<p>4</p>
<h3>Title 3</h3>
<p>7</p>
<p>9</p>
...
</div>
</body>
"""
page = bs4.BeautifulSoup(page, "html.parser")
div = page.find('div', {'class':"maincontent-block"})
mydict = {}
# write to the dictionary
for tag in div.findChildren():
if (tag.name == "h3"):
#print(tag.string)
mydict[tag.string] = None
nextTags = tag.findAllNext()
arr = [];
for nt in nextTags:
if (nt.name == "p"):
arr.append(nt.string)
mydict[tag.string] = arr
elif (nt.name == "h3"):
arr = []
break
# read from dictionary
arrKeys = []
for k in mydict:
arrKeys.append(k)
arrKeys.sort()
for k in arrKeys:
print k
for v in mydict[k]:
print v
【问题讨论】:
-
你的答案与硒无关。更新问题的标题和标签。
-
我想用 selenium 来做,但我做不到,所以问题还是一样。也许有人可以通过解决方案删除一两行。
标签: python html selenium beautifulsoup urllib2