【发布时间】:2018-05-14 19:59:20
【问题描述】:
我目前正在使用 Python 编写一个爬虫脚本,我想将以下 HTML 响应映射到一个多列表或字典中(没关系)。
我当前的代码是:
from bs4 import BeautifulSoup
from urllib.request import Request, urlopen
req = Request("https://my.site.com/crawl", headers={'User-Agent': 'Mozilla/5.0'})
webpage = urlopen(req)
soup = BeautifulSoup(webpage, 'html.parser')
ul = soup.find('ul', {'class': ''})
运行后,我得到以下结果存储在 ul 中:
<ul>
<li><a class="reference" href="#ref1">Data1</a></li>
<li><a class="reference" href="#ref2">Data2</a>
<ul>
<li><a class="reference" href="#ref3">Data3</a></li>
<li><a class="reference" href="#ref4">Data4</a>
<ul>
<li><a class="reference" href="#ref5"><span class="pre">Data5</span></a></li>
<li><a class="reference" href="#ref6"><span class="pre">Data6</span></a></li>
.
.
.
</ul>
</li>
</ul>
</li>
<li><a class="reference" href="#ref7">Data7</a>
<ul>
<li><a class="reference" href="#ref8"><span class="pre">Data8</span></a></li>
<li><a class="reference" href="#ref9"><span class="pre">Data9</span></a></li>
.
.
.
</ul>
</li>
<li><a class="reference" href="#ref10">Data10</a>
<ul>
<li><a class="reference" href="#ref11"><span class="pre">Data11</span></a></li>
<li><a class="reference" href="#ref12">Data12</a></li>
</ul>
</li>
</ul>
由于这是一个外部站点,我无法控制列表中元素的 id 或类。
我似乎无法理解这一点,有没有一种简单的方法可以将数据排列到列表或字典中?:
dict = {'Data1': {'href': 'ref1'},
'Data2': {'href': 'ref2', {
'Data3': {'href': 'ref3'},
'Data4': {'href': 'ref4', {
'Data5': {'href': 'ref5'},
'Data6': {'href': 'ref6'},
.
.
. }
}
}
}
}
我确实觉得这是一个繁琐的过程,但是我没有看到任何其他方法。
非常感谢任何帮助我朝着正确方向前进的帮助!
干杯!
【问题讨论】:
-
您的 HTML 结构不一致,您至少缺少一个开头的
<li>(或者结尾的</li>太多)。请确保它是干净的 HTML。在字典中,您确实需要一个用于测试字典值的键。也许'children'? -
它们是我想在未来查找的真实值,例如
formsemailmodel. -
这不是一个有效的数据结构。在每组大括号中,您的
href字典都有键,但您的孩子字典没有。这不是一个字典,也不是一个集合,它只是一个 SyntaxError。也许你想要'href': 'ref2', children: { …之类的东西? -
@MartijnPieters 是的,您对 HTML 结构的看法是正确的。我收到的数据更多,我试图缩短它。我猜是错误地添加了两个额外的
<li>-elements,这已经在帖子中修复了。
标签: python beautifulsoup html-lists