【发布时间】:2021-10-02 06:30:44
【问题描述】:
我想从 10 个div class = col-12 的 每个 的 3 个子级中的每个子级中提取字符串 text_i_wantA、text_i_wantB、text_i_wantC。为了可读性,我只包含了两个相同的结构化 div。现在我很好,如果它没有返回实际的.content[0],因为我也可以稍后解析它。
这里是完整的代码:
title,date,name,number = [],[],[],[]
while True:
soup = bs(driver.page_source, 'html5lib')
for div in soup.find_all('a', attrs={'title':'ad i'}):
titl = div.get_text(strip=True)
title.append(titl)
else:
break
for col in soup.find_all('div', attrs={'class':'col-12'})[1::2]:
row = []
for entry in col.select('div.row div'):
target = entry.find_all(text=True, recursive=False)
row.append(target[0].strip())
name.append(row[0])
date.append(row[1])
number.append(row[2])
next_btn = driver.find_elements_by_css_selector(".page-next button")
if next_btn:
actions = ActionChains(driver)
actions.move_to_element(next_btn[0]).click().perform()
time.sleep(4)
else:
break
driver.close()
预期输出:
title = ["text_i_already_have1", "text_i_already_have2", ...]
date = ["text_i_wantA", "text_i_wantAA", ...]
name = ["text_i_wantB", "text_i_wantBB", ...]
number = ["text_i_wantC", "text_i_wantCC", ...]
问题:实际输出with slice [1::2]
title = ["text_i_already_have1", "text_i_already_have2", ...]
date = ['text_i_wantA', 'text_i_wantAA', ...],
name = ['', '', '', '', '', '', '', '', '', '']
number = ['', '', '', '', '', '', '', '', '', '']
是我的 CSS 还是循环本身的问题?
第一行工作正常:
print(soup.find_all('div', attrs={'class':'col-12'})) without slice 给了我想要从以下位置提取 text_i_want 的 div 列表:
[<div class="col-12">
<a href="/url" target="_blank" title="ad i">
text_i_already_have1
</a>
</div>,
<div class="col-12">
<div class="row">
<div>
date: text_i_wantA
</div>
</div>
<div class="row">
<div>
source: text_i_wantB
</div>
</div>
<div class="row">
<div>
number: text_i_wantC
<span class="processlink">
<a href="url" title="text_i_dont_want">
text_i_dont_want
</a>
</span>
</div>
</div>
</div>,
<div class="col-12">
<a href="/url" target="_blank" title="ad i">
text_i_already_have2
</a>
</div>,
<div class="col-12">
<div class="row">
<div>
date: text_i_wantAA
</div>
</div>
<div class="row">
<div>
source: text_i_wantBB
</div>
</div>
<div class="row">
<div>
number: text_i_wantCC
<span class="processlink">
<a href="/url" title="text_i_dont_want">
text_i_dont_want
</a>
</span>
</div>
</div>
</div>,
<div class="col-12">
<a href="/url" target="_blank" title="ad i">
text_i_already_have
</a>
</div>,
<div class="col-12">
<div class="row">
<div>
date: text_i_wantAAA
</div>
</div>
<div class="row">
<div>
source: text_i_wantBBB
</div>
</div>
<div class="row">
<div>
number: text_i_wantCCC
<span class="processlink">
<a href="/url" title="text_i_dont_want">
text_i_dont_want
</a>
</span>
</div>
</div>
</div>,
<div class="col-12">
.
.
.
.
</div>]
text_i_dont_want 始终位于 <span class="processlink"> 元素内,该元素本身是 10_per_page <div class="col-12"> 元素中的每一个内的 3 个 <div class="row"> 元素之一的最后一个子元素。
【问题讨论】:
-
你的问题不清楚;鉴于问题中的示例 html,究竟您的预期输出是什么?
-
这样更好,但是您应该首先编辑您的问题并在此处添加所需的输出,而不是在评论中,然后(更重要的是)在示例 html 中添加另一个包含您的文本的元素不想想要。
-
只是为了确认:您不想要的文本总是在
<span class="processlink">元素内,它本身是 3 个元素之一的(最后一个?)子元素(或更多?)<div class="row">元素在多个<div class="col-12">元素中的每一个内? -
是的,没错。
text_i_dont_want始终位于<span class="processlink">元素内,该元素本身是多个<div class="col-12">元素中的每一个内的 3 个<div class="row">元素之一的最后一个子元素。
标签: css python-3.x beautifulsoup css-selectors