【问题标题】:CSS:nth-of-type in for loop doesent extract textCSS:for循环中的第n个类型不提取文本
【发布时间】:2021-10-02 06:30:44
【问题描述】:

我想从 10 个div class = col-12每个3 个子级中的每个子级中提取字符串 text_i_wantAtext_i_wantBtext_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 始终位于 &lt;span class="processlink"&gt; 元素内,该元素本身是 10_per_page &lt;div class="col-12"&gt; 元素中的每一个内的 3 个 &lt;div class="row"&gt; 元素之一的最后一个子元素。

【问题讨论】:

  • 你的问题不清楚;鉴于问题中的示例 html,究竟您的预期输出是什么?
  • 这样更好,但是您应该首先编辑您的问题并在此处添加所需的输出,而不是在评论中,然后(更重要的是)在示例 html 中添加另一个包含您的文本的元素不想想要。
  • 只是为了确认:您想要的文本总是在 &lt;span class="processlink"&gt; 元素内,它本身是 3 个元素之一的(最后一个?)子元素(或更多?)&lt;div class="row"&gt; 元素在多个 &lt;div class="col-12"&gt; 元素中的每一个内?
  • 是的,没错。 text_i_dont_want 始终位于 &lt;span class="processlink"&gt; 元素内,该元素本身是多个 &lt;div class="col-12"&gt; 元素中的每一个内的 3 个 &lt;div class="row"&gt; 元素之一的最后一个子元素。

标签: css python-3.x beautifulsoup css-selectors


【解决方案1】:

如果我现在对您的理解正确,这应该可以让您到达那里(或至少足够接近):

date,name,number = [],[],[]
for col in soup.find_all('div', attrs={'class':'col-12'}):
    row = []
    for entry in col.select('div.row div'):
        target = entry.find_all(text=True, recursive=False)
        row.append(target[0].strip())
    date.append(row[0])
    name.append(row[1])
    number.append(row[2])   

例如print(date) 的输出应该是:

['text_i_wantA', 'text_i_wantAA']

【讨论】:

  • 谢谢,name 有正确的价值观。不幸的是date = ['', '', '', '', '', '', '', '', '', '']number = ['', '', '', '', '', '', '', '', '', ''] 只包含空字符串.. 我看到你接近了
  • @id345678 它适用于问题中的示例 html。但是,当然,示例并不总是代表实际的 html。尽管如此,一旦对代码进行了适当的调整,该方法应该适用于实际的 html。至于调整,你必须尝试不同的东西,看看有什么效果。
  • 听起来不错,它适用于name。但我不明白为什么它不适合另一个,因为结构很清楚。我在上面的问题中添加了整个outerHTML。它对datenumber 不起作用,但我也没有收到任何错误
  • @id345678 不知道是什么问题。使用您更新的 html 作为 soup 的来源,我得到 3 个列表,每个列表包含 10 个项目。 name 列表似乎改为引用 source,但除此之外一切正常。
  • 当我删除切片 [1::2] 时,它会在 date.append(row[0]) 处出现 IndexError: list index out of range。我更新了 html 以明确我需要切片的原因。
猜你喜欢
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-03
相关资源
最近更新 更多