当前位置: 首页 > 知识库问答 >
问题:

找不到带有xpath的img元素

南门烈
2023-03-14

有人能告诉我为什么下面的代码不返回表情符号属性吗...

from selenium.webdriver import Chrome
import time
from selenium.common.exceptions import NoSuchElementException
import re    

# open webpage and allow time to load entirely
driver = Chrome()
driver.implicitly_wait(15)
driver.get("https://twitter.com")
time.sleep(2)

# start scraping tweets
tickerOptDetails = []
tweet_ids = set()
tweet_ids.clear()
print(tweet_ids)


def main():

    # prevent computer from going to sleep
    pyautogui.press('shift')

    print("--checking for new alert...")
    page_cards = driver.find_elements_by_xpath('//article[@data-testid="tweet"]')

    for card in page_cards:
        try:
            ticker = card.find_element_by_xpath('//span/a[starts-with(text(),"$")]').text.replace('$', '')
            optCriteria = card.find_element_by_xpath('//span/a[starts-with(text(),"$")]'
                                                     '/../following-sibling::span').text.split('\n')[0]\
                .replace('-', '').replace('$', '')
            emoji = card.find_element_by_xpath("//img[contains(@src,'https://abs-0.twimg.com/emoji/v2/svg/1f402.svg')"
                                               " or contains(@src,'https://abs-0.twimg.com/emoji/v2/svg/1f43b.svg')]")\
                .get_attribute("title")
            

            tradeCriteria = str(ticker+optCriteria)
        except NoSuchElementException:
            continue

       if tradeCriteria:
            tweet_id = ' '.join(tradeCriteria)
            if tweet_id not in tweet_ids:
                 tweet_ids.add(tweet_id)
                 if 13 < len(tradeCriteria) < 22 and re.search(r'\d{8} \D ', tradeCriteria):

                      print(tradeCriteria)
                      print(emoji)

main()

但是下面的代码将返回一个表情符号属性...

from selenium.webdriver import Chrome
import time
from selenium.common.exceptions import NoSuchElementException
import re


# open webpage and allow time to load entirely
driver = Chrome()
driver.get("https://twitter.com")
time.sleep(2)

# start scraping tweets
tickerOptDetails = []
emojiSet = []
tweet_ids = set()
last_position = driver.execute_script("return window.pageYOffset;")
scrolling = True
tweet_ids.clear()
print(tweet_ids)
page_cards = driver.find_elements_by_xpath('//article[@data-testid="tweet"]')

while scrolling:
    page_cards = driver.find_elements_by_xpath('//article[@data-testid="tweet"]')
    for card in page_cards:
        try:
            ticker = card.find_element_by_xpath('//span/a[starts-with(text(),"$")]').text.replace('$', '')
            optCriteria = card.find_element_by_xpath('//span/a[starts-with(text(),"$")]'
                                                     '/../following-sibling::span').text.split('\n')[0].replace('-', '').replace('$', '')
            emoji = card.find_element_by_xpath("//img[contains(@src,'https://abs-0.twimg.com/emoji/v2/svg/1f402.svg') or"
                                               " contains(@src,'https://abs-0.twimg.com/emoji/v2/svg/1f43b.svg')]")\
                .get_attribute("title")
            
            tradeCriteria = str(ticker+optCriteria)
        except NoSuchElementException:
            continue

        if tradeCriteria:
            tweet_id = ''.join(tradeCriteria)
            if tweet_id not in tweet_ids:
                tweet_ids.add(tweet_id)
                if 13 < len(tradeCriteria) < 22 and re.search(r'\d{8} \D ', tradeCriteria):

                    print(tradeCriteria)
                    print(emoji)

    scroll_attempt = 0
    while True:
        # check scroll position
        driver.execute_script('window.scrollTo(0, document.body.scrollHeight);')
        time.sleep(2)
        curr_position = driver.execute_script("return window.pageYOffset;")
        if last_position == curr_position:
            scroll_attempt += 1

            if scroll_attempt >= 3:
                scrolling = False
                break
            else:
                time.sleep(2)
        else:
            last_position = curr_position
            break

print(tweet_ids)

我知道我已经将滚动添加到第二个代码中,所以它会查看整个页面并返回我要查找的元素。但除此之外,它们或多或少是相同的。我可以每隔几秒钟运行第一个代码,它永远找不到表情符号元素。它会发现代码和optCriteria没有问题,并将它们作为tradeCriteria打印在一起,但即使它在那里,它也永远找不到表情符号属性。

我尝试了隐式等待和显式等待,但都不起作用。我还尝试在if语句if 13中使用emoji xpath行


共有1个答案

韦高阳
2023-03-14
匿名用户

将代码插入比较检查器后,似乎分别在第 38 行和第 43 行之间缺少空格。

43:tweet_id=''。加入(tradeCriteria)
38:tweet_id=''。加入(Trade Criterias)

当连接时,此空格导致< code>tradeCriteria列表中的每个元素之间有一个空格。

43: 一个 b c

38:abc

看到print(emoji)语句如何在之后,如果tweet_id不在两个文件的tweet_ids:中,我认为这种差异是导致第一个文件出现问题的原因。

或者,如果您要从推特抓取数据,则可以尝试使用带有Python包装器(例如Tweepy)的官方推特API,因为它稍微容易一些。您可以在此处了解有关如何执行此操作的更多信息。

 类似资料:
  • 我是新来的。如果问题重复,很抱歉,但我没有找到解决方法。 我有一个问题--我无法使用Xpath定位元素,但我使用ID定位器定位它没有问题。见附件截图。这一问题不仅针对这一要素,而且也针对所有要素。看来Xpath根本不起作用。 我正在使用Appium 7.3.0(试用过不同版本),UIAutomator2,方法是在模拟器上设置,Android 8.1功能。 null 此外,我在需要的地方使用了和,因

  • 问题内容: 我正在尝试编写Selenium测试用例,并从Firefox中的Selenium IDE开始。那里的测试工作很好。现在,我想使用Selenium Webdriver自动化该测试,并导出相应的JAVA类。到目前为止,一切都已设置并且运行良好(Internet Explorer窗口正在打开,显示相应的页面)。 但是:Selenium Webdriver找不到元素。我想获得以下元素: 而且我有

  • Selenium.Common.Exceptions.NosuChelementException:消息:没有这样的元素:找不到元素:

  • 我想从这个网站上提取红色标记的信息。 本站的html文本由以下图片呈现。我要提取的信息再次被红色标记。 问题是我找不到带有class属性“find-元素”的div元素。我的代码看起来像这样 如果有人能帮我,那就太好了。 谢谢。

  • 我试图使用Selenium和Python自动化一些测试。我使用Selenium IDE创建了一个套件,它工作得很好。 我现在试图在Python脚本中重新创建这个套件,但遇到了一个问题。 使用XPATH代替ID 使用隐式等待 使用从IDE导出到Python生成的函数 使用WebDriverWait 以下是IDE中的html定义: 使用隐式等待的Python脚本。所有工作都很好,直到最后一行中的冒犯元

  • 我需要在HTML中找到此元素 我就是这样做的 使用XPATH,由Chrome控制台生成: 使用XPATH,它正在寻找某种正则表达式: 最后使用XPATH,它通过页面精确到我的元素 他们都没有工作。All给出了一个例外 硒。常见的例外情况。InvalidSelectorException:Message:u'由于以下错误,给定的选择器无法找到具有xpath表达式的元素:\n语法错误:表达式不是合法表