有没有办法按顺序获取单个元素的多个文本和属性的值?

问题描述 投票:0回答:1

我正在尝试重建网络上的帖子,并且我在大多数网站上使用下面的代码来抓取文本都取得了成功。

parent = driver.find_element(By.XPATH, "//*") # main post element
child = parent.find_elements(By.XPATH, ".//*") # child containing texts/emojis/links/images
        for i in child:
            if i.text is not None:
                post.append(i.get_attribute('textContent'))
            if i.get_attribute('alt') is not None:
                post.append(i.get_attribute('alt'))
text = ''.join(post)
print(text)

我基本上是通过获取

textContent
alt
来重建帖子,因为它们被发现并由
find_elements
列出。如果子项包含
text
,则将获取文本,如果没有,则将获取表情符号/图像的
alt

可以使用

get_attribute
获取帖子的所有内容,因为文本和表情符号的 each 都位于子元素内。然而,我遇到了一个结构,其中只有一个子项(
<div>
)包含所有
text
alt
。下面的例子:

<span class="post">
    <div class="paragraph1">
        <div>
            <span class="html-span link">
                <a>#link1 </a>
            </span>
            "A "
            <span class="html-span emoji">
                <img alt=":)">
            </span>
            "B "
        </div>
    </div>
    <div class="paragraph2">
        <div>
            "C "
            <span class="html-span link">
                <a>#link2</a>
            </span>
            "D "
            <span class="html-span emoji">
                <img alt=":(">
            </span>
            "E"
        </div>
    </div>
</span>

是否可以将想法

//text() or //*[@img='alt']
付诸行动?似乎不允许将
find_elements
By.XPATH, //text()
一起使用。

预期输出:

#link1 A :) B C #link2 D :( E

尝试过:

    parent = driver.find_element(By.XPATH, "//*") # main post element
    child = parent.find_elements(By.XPATH, ".//*[contains(@class, 'html-span')]//*") # child containing texts/emojis/links/images
    for i in child:
        print(i.get_attribute('textContent'))
        if i.text is not None:
            post.append(i.get_attribute('textContent'))
        if i.get_attribute('alt') is not None:
            post.append(i.get_attribute('alt'))
    print(post)
    text = ''.join(post)
    print(text)

结果: [#link, '', :), '', '', #link2, '', :(, ''] # 缺少孩子的

text

    parent = driver.find_element(By.XPATH, //span[@class='post']")
    print(parent.get_attribute('textContent'))

结果:

#link1 A B C #link2 D E
# 缺少
alt
属性

我正在尝试对每个段落进行分组

class
并构建他们的句子。但能够按顺序获取整个帖子的属性和文本就足够了。

非常感谢任何有关如何进行的想法。

python selenium-webdriver web-scraping xpath
1个回答
0
投票

这个脚本应该可以工作:

script = '''
function getText(node){
  let text = [];
  for (let i = 0; i < node.childNodes.length; i++){
    const child = node.childNodes[i];
    if (child.alt){
      text.push(child.alt);
    } else if (child.children){
      text.push(getText(child));
    } else {
      const content = child.textContent.trim();
      content && text.push(content);
    }
  }
  return text.join(' ');
}

return getText(arguments[0])
'''
span = driver.find_element(By.CSS_SELECTOR, 'span.post')
text = driver.execute_script(script, span)
print(text)
© www.soinside.com 2019 - 2024. All rights reserved.