理解美化组过滤有问题吗

2024-04-24 00:27:17 发布

您现在位置:Python中文网/ 问答频道 /正文

有人能解释一下这个过滤是如何和靓汤一起工作的吗。我得到了下面的HTML,我正试图从中筛选特定的数据,但我似乎无法访问它。我尝试了各种方法,从收集所有的class=g到只抓取特定div中感兴趣的项目,但是我没有得到任何返回或打印。在

每一页都有一个<div class="srg">div和多个<div class="g">div,我要使用的数据是包含<div class="g">的数据。每一个都有 多个div,但我只对<cite>和{}数据感兴趣。我正在努力理解如何过滤工作,任何帮助将不胜感激。在

我尝试过遍历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并找到所有的

^{pr2}$

测试数据

<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

更新尝试

我试着采用亚历克斯的方法,但到目前为止没有成功,我走的路对吗?在

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))

Tags: 数据textdivurlstyleresponselifind
2条回答

您不必手动处理层次结构-让BeautifulSoup来操心它。您的第二种方法与您真正应该尝试的方法很接近,但是一旦您获得了包含class="s"div,并且其中没有cite元素,它就会失败。在

相反,您需要让BeautifulSoup知道您对包含特定元素的特定元素感兴趣。让我们请求位于div内的cite元素,其中class="g"位于div元素内,其中class="srg"-div.srg div.g citeCSS selector元素可以准确地找到我们要问的内容:

for cite in soup.select("div.srg div.g cite"):
    span = cite.find_next_sibling("span", class_="st")

    print(cite.get_text(strip=True))
    print(span.get_text(strip=True))

然后,一旦找到cite,我们就“往一边走”,用class="st"抓取下一个span同级元素。不过,是的,我们假设它存在。在

对于提供的示例数据,它将打印:

^{pr2}$

更新的输入数据的更新代码:

for cite in soup.select("li.g div.s div.kv cite"):
    span = cite.find_next("span", class_="st")

    print(cite.get_text(strip=True))
    print(span.get_text(strip=True))

另外,请确保您使用的是第四个版本:

pip install  upgrade beautifulsoup4

进口声明应为:

from bs4 import BeautifulSoup

首先获取类名为srgdiv,然后在这个srg中找到所有类名为s的div,并得到site和{}的文本。以下是我的工作守则-

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

输出-

^{pr2}$

编辑

为什么你的代码不起作用

试一下-

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

尝试二-

您正在打印不在打印范围内的site和{}。所以试着在内部打印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

相关问题 更多 >