有人可以解释一下美丽汤的过滤是如何工作的吗?我得到了下面的 HTML,我正在尝试从中过滤特定数据,但我似乎无法访问它。我尝试过各种方法,从收集所有class=g
是为了只抓取该特定 div 中感兴趣的项目,但我只是没有返回或没有打印。
每个页面都有一个<div class="srg">
div 有多个<div class="g">
divs,我要使用的数据是其中的数据<div class="g">
。其中每一个都有
多个 div,但我只对<cite>
and <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>
UPDATE
在 Alecxe 的解决方案之后,我再次尝试使其正确,但仍然没有打印任何内容。所以我决定再看一下soup
它看起来不一样。我之前在看response.text
from requests
。我只能认为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))