首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >BeautifulSoup查找只有“点”而没有“find()”函数的子函数

BeautifulSoup查找只有“点”而没有“find()”函数的子函数
EN

Stack Overflow用户
提问于 2020-03-28 08:08:56
回答 1查看 269关注 0票数 1

我试图启动变量的特定元素,而不使用'find()‘或findAll()’函数,只使用BeautifulSoup和'dots‘。我搞不懂的是优先顺序。使用findAll()函数有很多‘查找孩子’的问题,但似乎没有‘点’的东西。所以最后我写了这个问题。

下面是一个例子。

代码语言:javascript
运行
复制
<div class="item-container">
    <!--product image-->
    <a class="item-img" href="https://www.newegg.com/asus-geforce-rtx-2080-ti-dual-rtx2080ti-o11g/p/N82E16814126247?Item=N82E16814126247">
        <div class="item-badges">
            <div class= "item-test">
             </div>
        </div>
        <img alt="ASUS Dual GeForce RTX 2080 Ti DirectX 12 DUAL-RTX2080TI-O11G 11GB 352-Bit GDDR6 PCI Express 3.0 HDCP Ready SLI Support Video Card" class="lazy-img" data-effect="fadeIn" data-src="//c1.neweggimages.com/NeweggImage/ProductImageCompressAll300/14-126-247-V50.jpg" src="//c1.neweggimages.com/WebResource/Themes/2005/Nest/blank.gif" title="ASUS Dual GeForce RTX 2080 Ti DirectX 12 DUAL-RTX2080TI-O11G 11GB 352-Bit GDDR6 PCI Express 3.0 HDCP Ready SLI Support Video Card">
        </img>
    </a>
    <div class="item-info">
        <!--brand info-->
        <div class="item-branding">
            <a class="item-brand" href="https://www.newegg.com/ASUS/BrandStore/ID-1315">
                <img alt="ASUS" class="lazy-img" data-effect="fadeIn" data-src="//c1.neweggimages.com/Brandimage_70x28//Brand1315.gif" src="//c1.neweggimages.com/WebResource/Themes/2005/Nest/blank.gif" title="ASUS">
                </img></a>
            <!--rating info-->
            <a class="item-rating" href="https://www.newegg.com/asus-geforce-rtx-2080-ti-dual-rtx2080ti-o11g/p/N82E16814126247?Item=N82E16814126247&amp;SortField=0&amp;SummaryType=0&amp;PageSize=10&amp;SelectedRating=-1&amp;VideoOnlyMark=False&amp;IsFeedbackTab=true#scrollFullInfo" title="Rating + 2"><i class="rating rating-2"></i><span class="item-rating-num">(32)</span></a>
        </div>
</div>
</div>
代码语言:javascript
运行
复制
from urllib.request import urlopen as uReq
from bs4 import BeautifulSoup as soup

my_url = "https://www.newegg.com/Video-Cards-Video-Devices/Category/ID-38?Tpk=graphic%20card"
uClient = uReq(my_url)
page_html = uClient.read() 
uClinet.close()
page_soup = soup(page_html, "html.parser")

从现在开始,我会找到“品牌化”类的div。所以我就这样走了

代码语言:javascript
运行
复制
>>> page_soup.div.div

你是怎么熬过来的?这似乎取决于python的版本或者其他什么的。它因用户而异。

有人得到,但我得到了。你看到这个区别了吗?

第一个(得到),在第一个级别的孩子中得到div。div类‘项-徽章’是子级a(类‘项img')的子级,所以它是二级子级。因此,拼写'page_soup.div‘跳过了第一个’a(项目-图像)‘中的div(项目-标记),并被捕获为第一个'div’。因此,'page_soup.div.div‘可以直接进入'div class=’项目--品牌。

然而,第二个,我的电脑不做同样的事情用同样的咒语。

我的咒语'page_soup.div.div‘发现'div class=’项目测试‘。我的咒语“page_soup.div”从顶部进入了最近的div,而不考虑孩子的等级。它刚进入第一个div,在孩子的“a(类项目-徽章)”里面。所以'page_soup.div.div‘进入了'div class=’项目测试‘,在项目徽章中的第一个div。

同样的咒语,但逻辑不同。

你知道这有什么不同吗?以及如何解决这个问题?

谢谢你天才。

我使用python 3.7 32x

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-28 08:26:04

您要求的内容在这里有详细的记录:BS:使用标记名称导航

导航解析树的最简单方法是说出您想要的标记的名称。如果您想要<head>标记,只需说soup.head。 您可以一次又一次地使用这个技巧来放大解析树的某个部分。soup.body.b<body>标记下获取first <b>标记。 使用标记名作为属性只会给出第一个标记的名称。 如果您需要获取所有的<a>标记,或者任何比具有特定名称的第一个标记更复杂的东西,则需要使用搜索树中描述的方法之一,例如find_all() (重点和遗漏)

因此,您的page_soup.div.div找到了div中的第一个divpage_soup.div找到了第一个div

代码语言:javascript
运行
复制
<html>

<head>
  <title>The Dormouse's story</title>
</head>

<body>
  <div>first div</div>
  <p>unrelated
  </p>
  <div>second div
    <div>with another div inside</div>
  </div>

  <div>can't get this one by soup.div.div
    <div>with another div inside</div>
  </div>
</body

对于该代码,您可以通过soup.div获得第一个代码,通过.div.div获得第二个代码。最后一个只能通过做一个findall()才能得到。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60898762

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档