我正在尝试重建网络上的帖子,并且我在大多数网站上使用下面的代码来抓取文本都取得了成功。
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
并构建他们的句子。但能够按顺序获取整个帖子的属性和文本就足够了。
非常感谢任何有关如何进行的想法。
这个脚本应该可以工作:
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)