【问题标题】:selenium, xpath: How to select a node within node?selenium,xpath:如何在节点内选择一个节点?
【发布时间】:2018-07-15 09:10:39
【问题描述】:

我的网页结构如下:

<div class="l_post j_l_post l_post_bright "...>
    ...
    <div class="j_lzl_c_b_a core_reply_content">
       <li class="lzl_single_post j_lzl_s_p first_no_border" ...>
         <div class="lzl_cnt">
         content
         </div>
       </li>
       <li class="lzl_single_post j_lzl_s_p first_no_border" ...>
       ...
       </li>
    </div>

</div>
<div class="l_post j_l_post l_post_bright "...>
...(contain content, same as above)
</div>
...

目前我可以像这样一步一步选择所有内容:

for i in driver.find_elements_by_xpath('//*[@class="lzl_cnt"]'):
    print(i.text)

但正如您所见,网页由重复的块组成,其中包含我需要的 内容因此我想单独获取这些内容以及与这些重复内容不同的其他信息块(&lt;div class="l_post j_l_post l_post_bright "...&gt;...&lt;/div&gt;),另外,我希望将&lt;li class ="lzl_single_post"...&gt;中的那些内容分开,以便我以后更容易处理这些内容。我试过这个:

items = []

# get each blocks
for sel in driver.find_elements_by_xpath('//div[@class="l_post j_l_post l_post_bright  "]'):
    name = sel.find_element_by_css_selector('.d_name').text
    try: content = sel.find_element_by_css_selector('.j_d_post_content').text
    except: content = '',
    try: 
        reply = []
        # get each post within specific block
        for i in sel.find_elements_by_xpath('//*[@class="lzl_cnt"]'):
            reply.append(i.text)
    except: reply = []
    items.append({'name': name, 'content': content, 'reply': reply})

但结果显示,每次外部 for 循环运行时,我都会收到网页上的所有回复,而不是我想要的每个单独块的一组回复

有什么建议吗?

【问题讨论】:

    标签: html xpath selenium-webdriver css-selectors


    【解决方案1】:

    只需将.(上下文指针)添加到 XPath 为

    sel.find_elements_by_xpath('.//*[@class="lzl_cnt"]')
    

    请注意,//*[@class="lzl_cnt"] 表示 DOM 中具有 "lzl_cnt" 类名的所有节点,而 .//*[@class="lzl_cnt"] 表示 所有具有 sel 类名的 sel 的后代节点

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-08
      • 2021-04-07
      • 1970-01-01
      • 1970-01-01
      • 2021-11-15
      • 2022-08-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多