【发布时间】:2015-11-26 18:09:45
【问题描述】:
谁能解释一下过滤是如何与 Beautiful Soup 一起工作的。我得到了下面的 HTML,我试图从中过滤特定数据,但我似乎无法访问它。我尝试了各种方法,从收集所有 class=g 到仅抓取该特定 div 中感兴趣的项目,但我只得到无返回或没有打印。
每个页面都有一个<div class="srg"> div 和多个<div class="g"> div,我希望使用的数据是<div class="g"> 的数据。其中每一个都有
多个 div,但我只对 <cite> 和 <span class="st"> 数据感兴趣。我正在努力理解过滤的工作原理,任何帮助将不胜感激。
我尝试遍历 div 并抓取相关字段:
soup = BeautifulSoup(response.text)
main = soup.find('div', {'class': 'srg'})
result = main.find('div', {'class': 'g'})
data = result.find('div', {'class': 's'})
data2 = data.find('div')
for item in data2:
site = item.find('cite')
comment = item.find('span', {'class': 'st'})
print site
print comment
我也尝试过进入初始 div 并找到所有;
soup = BeautifulSoup(response.text)
s = soup.findAll('div', {'class': 's'})
for result in s:
site = result.find('cite')
comment = result.find('span', {'class': 'st'})
print site
print comment
测试数据
<div class="srg">
<div class="g">
<div class="g">
<div class="g">
<div class="g">
<!--m-->
<div class="rc" data="30">
<div class="s">
<div>
<div class="f kv _SWb" style="white-space:nowrap">
<cite class="_Rm">http://www.url.com.stuff/here</cite>
<span class="st">http://www.url.com. Some info on url etc etc
</span>
</div>
</div>
</div>
<!--n-->
</div>
<div class="g">
<div class="g">
<div class="g">
</div>
更新
在 Alecxe 的解决方案之后,我再次尝试将其正确,但仍然没有打印任何内容。所以我决定再看看soup,它看起来不一样。我之前从requests 看response.text。我只能认为BeautifulSoup 修改了response.text 或者我第一次弄错了样本(不确定如何)。然而,下面是基于我从soup 打印中看到的新示例。在此之下,我尝试获取我所追求的元素数据。
<li class="g">
<h3 class="r">
<a href="/url?q=url">context</a>
</h3>
<div class="s">
<div class="kv" style="margin-bottom:2px">
<cite>www.url.com/index.html</cite> #Data I am looking to grab
<div class="_nBb">
<div style="display:inline"snipped">
<span class="_O0"></span>
</div>
<div style="display:none" class="am-dropdown-menu" role="menu" tabindex="-1">
<ul>
<li class="_Ykb">
<a class="_Zkb" href="/url?/search">Cached</a>
</li>
</ul>
</div>
</div>
</div>
<span class="st">Details about URI </span> #Data I am looking to grab
更新尝试
到目前为止,我尝试采用 Alecxe 的方法没有成功,我是否走在正确的道路上?
soup = BeautifulSoup(response.text)
for cite in soup.select("li.g div.s div.kv cite"):
span = cite.find_next_sibling("span", class_="st")
print(cite.get_text(strip=True))
print(span.get_text(strip=True))
【问题讨论】:
标签: python html beautifulsoup