我正在尝试网络抓一个网站(Here is the link to website),但页面中的div似乎有多个类属性,这使我很难刮掉数据。我试图查找Stackoverflow上发布的历史问题,但找不到我想要的答案。以下是我从网站上提取的代码的一部分:
<div data-reactid="118">
<div class="ue-ga base_ ue-jk" style="margin-left:-24px;margin-bottom:;" data-reactid="119">
<div style="display: flex; flex-direction: column; width: 100%; padding-left: 24px;" data-reactid="120">
<div class="ue-a3 ue-ap ue-a6 ue-gb ue-ah ue-n ue-f5 ue-ec ue-gc ue-gd ue-ge ue-gf base_ ue-jv ue-gz ue-h0 ue-h1" data-reactid="121">
<div class="ue-a6 ue-bz ue-gb ue-ah ue-gg ue-gh ue-gi" data-reactid="122">
<div class="ue-bn ue-bo ue-cc ue-bq ue-g9 ue-bs" title="Want to extract this part" data-reactid="123">
Want to extract this part
</div>
</div>
</div>
</div>
</div>
</div>
我想要提取的是文本,其中声明“想要提取此部分”。我确实想过通过data-reactid抓取数据,但不同的页面分配了不同的数据重新编号,所以不是一个好主意。我还想告知类名不是唯一的。
谁能引导我通过这个?非常感激。
如果每个页面上的特定元素的类始终保持相同,则可以使用此选择器将其作为目标:
.ue-bn.ue-bo.ue-cc.ue-bq.ue-g9.ue-bs
但是,您可以使用许多其他选择器,但这取决于它们是否在页面中是唯一且一致的。
你可以使用jQuery
如下。
$("div[title=Want to extract this part]").text();
菜单:
- 循环使用的所有菜单,css选择器:div.base_ h3
- 菜单名称,xpath://div[contains(@class,'base_')]//h3[.='Big Mac® Bundles']
食物卡片
- 标题,css选择器:div[title]
- titles,xpath://div[./div[@title]]/div[@title]
- 价格,xpath://div[./div[@title]]//span
如果你想循环:
cards = driver.find_elements_by_xpath("//div[./div[@title]]")
for card in cards:
title = card.find_element_by_css_selector("div[title]")
price = card.find_element_by_css_selector("span")
#or using xpath
#title = card.find_element_by_xpath("./div[@title]")
#price = card.find_element_by_xpath(".//span")
这可能对你有所帮助
from bs4 import BeautifulSoup
html = """<div data-reactid="118">
<div class="ue-ga base_ ue-jk" style="margin-left:-24px;margin-bottom:;" data-reactid="119">
<div style="display: flex; flex-direction: column; width: 100%; padding-left: 24px;" data-reactid="120">
<div class="ue-a3 ue-ap ue-a6 ue-gb ue-ah ue-n ue-f5 ue-ec ue-gc ue-gd ue-ge ue-gf base_ ue-jv ue-gz ue-h0 ue-h1" data-reactid="121">
<div class="ue-a6 ue-bz ue-gb ue-ah ue-gg ue-gh ue-gi" data-reactid="122">
<div class="ue-bn ue-bo ue-cc ue-bq ue-g9 ue-bs" title="Want to extract this part" data-reactid="123">
Want to extract this part
</div>
</div>
</div>
</div>
</div>
</div>"""
soup = BeautifulSoup(html,'html.parser')
tag = soup.find('div', attrs={'class':'ue-bn'})
text = (''.join(tag.stripped_strings))
print (text)
根据您共享的HTML来提取文本想要提取此部分,因为元素是一个React元素,您必须引导WebDriverWait才能使元素可见,您可以使用以下任一解决方案:
title
属性:
myText = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.base_ div[title]"))).get_attribute("title")
innerHTML
:
myText = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "div.base_ div[title]"))).get_attribute("innerHTML")
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC