gpt4 book ai didi

python - 在理解 BeautifulSoup 过滤时遇到问题

转载 作者:搜寻专家 更新时间:2023-10-31 08:26:33 26 4
gpt4 key购买 nike

谁能解释一下过滤是如何与 Beautiful Soup 一起工作的。我有下面的 HTML,我试图从中过滤特定数据,但我似乎无法访问它。我尝试了各种方法,从收集所有 class=g只是抓取该特定 div 中感兴趣的项目,但我只得到 None 返回或没有打印。

每个页面都有一个<div class="srg">具有多个 <div class="g"> 的 div 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它看起来不一样。我之前在看 response.text来自 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))

最佳答案

首先获取带有类名 srgdiv 然后在 srg 中找到所有带有类名 s 的 div 并且获取该站点评论的文本。以下是我的工作代码-

from bs4 import BeautifulSoup

html = """<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>"""

soup = BeautifulSoup(html , 'html.parser')
labels = soup.find('div',{"class":"srg"})

spans = labels.findAll('div', {"class": 'g'})

sites = []
comments = []

for data in spans:
site = data.find('cite',{'class':'_Rm'})
comment = data.find('span',{'class':'st'})
if site:#Check if site in not None
if site.text.strip() not in sites:
sites.append(site.text.strip())
else:
pass
if comment:#Check if comment in not None
if comment.text.strip() not in comments:
comments.append(comment.text.strip())
else: pass

print sites
print comments

输出-

[u'http://www.url.com.stuff/here']
[u'http://www.url.com. Some info on url etc etc']

编辑--

为什么你的代码不起作用

试一试

您正在使用 result = main.find('div', {'class': 'g'}) 它将获取单个和第一个遇到的元素,但第一个元素没有 div 与类名 s 。所以这段代码的下一部分将不起作用。

尝试二-

您正在打印不在打印范围内的 sitecomment。所以尝试在 for 循环中打印。

soup = BeautifulSoup(html,'html.parser') 

s = soup.findAll('div', {'class': 's'})

for result in s:
site = result.find('cite')
comment = result.find('span', {'class': 'st'})
print site.text#Grab text
print comment.text

关于python - 在理解 BeautifulSoup 过滤时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33944824/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com