我试图启动变量的特定元素,而不使用'find()‘或findAll()’函数,只使用BeautifulSoup和'dots‘。我搞不懂的是优先顺序。使用findAll()函数有很多‘查找孩子’的问题,但似乎没有‘点’的东西。所以最后我写了这个问题。
下面是一个例子。
<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&SortField=0&SummaryType=0&PageSize=10&SelectedRating=-1&VideoOnlyMark=False&IsFeedbackTab=true#scrollFullInfo" title="Rating + 2"><i class="rating rating-2"></i><span class="item-rating-num">(32)</span></a>
</div>
</div>
</div>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。所以我就这样走了
>>> 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
发布于 2020-03-28 08:26:04
您要求的内容在这里有详细的记录:BS:使用标记名称导航
导航解析树的最简单方法是说出您想要的标记的名称。如果您想要
<head>标记,只需说soup.head。 您可以一次又一次地使用这个技巧来放大解析树的某个部分。soup.body.b在<body>标记下获取first<b>标记。 使用标记名作为属性只会给出第一个标记的名称。 如果您需要获取所有的<a>标记,或者任何比具有特定名称的第一个标记更复杂的东西,则需要使用搜索树中描述的方法之一,例如find_all()(重点和遗漏)
因此,您的page_soup.div.div找到了div中的第一个div,page_soup.div找到了第一个div。
<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()才能得到。
https://stackoverflow.com/questions/60898762
复制相似问题