【问题标题】:How to extract the hashtags from twitter page explore?如何从 twitter 页面探索中提取主题标签?
【发布时间】:2019-08-18 08:42:19
【问题描述】:

我想使用 python3 上的 selenium 从 twitter 的探索页面中提取标签名称(主题标签)。但是没有特殊的标签或类甚至 id 可以找到并保存它们。

有没有一种方法可以提取它们,即使它们发生变化,也不必每次都编辑我的代码?

我认为以下代码将使用链接文本将我带到探索页面。但是我不能使用相同的方法来定位标签,因为它们时不时地变化。

explore = driver.find_element_by_link_text("Explore")

我希望能够找到标签并将它们保存到一个列表中,以便以后在我的工作中使用该列表。

这是其中一个标签的 html 代码:

<span class="r-18u37iz"><span dir="ltr" class="css-901oao css-16my406 r-1qd0xha r-ad9z0x r-bcqeeo r-qvutc0">#ARSBUR</span></span>

这些类不是唯一的,它们在页面的其他元素中使用,所以我不能使用它们。

如果有办法找到 (#) 标记,那么我只能获取包含它们的文本。

【问题讨论】:

    标签: python selenium xpath css-selectors webdriverwait


    【解决方案1】:

    要从 twitter 的探索页面中提取 hashtags,即在 Python 3 上使用 Selenium https://twitter.com/explorer?lang=en,您必须诱导 WebDriverWait对于visibility_of_all_elements_located(),您可以使用以下任一Locator Strategies

    • 使用CSS_SELECTOR

      driver.get("https://twitter.com/explorer?lang=en")
      print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "a[href^='/hashtag']>span.trend-name")))])
      
    • 使用XPATH

      driver.get("https://twitter.com/explorer?lang=en")
      print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 5).until(EC.visibility_of_all_elements_located((By.XPATH, "//a[starts-with(@href, '/hashtag')]/span[contains(@class, 'trend-name')]")))])
      
    • 注意:您必须添加以下导入:

      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.common.by import By
      from selenium.webdriver.support import expected_conditions as EC
      
    • 控制台输出:

      ['#MCITOT', '#WorldSupportsKashmir', '#MCIvsTOT', '#11YearsOFViratism', '#ManCity']
      

    【讨论】:

    • 我尝试了 xpath 的方式来尝试定位标签,但我遇到了错误。 python 78 if time.time() &gt; end_time: 79 break ---&gt; 80 raise TimeoutException(message, screen, stacktrace) 81 82 def until_not(self, method, message=''): TimeoutException: Message: 你知道的,我把链接改成了 (explore) 而不是 (explorer)
    【解决方案2】:

    您可以将页面源代码转储到 beautifulsoup 4.7.1 + 中并使用 :contains 和类。您的课程看起来与我看到的不同,但我正在对 url 做出假设。

    注意在页面上可以有其他 # 在不同的类下,这将使选择器 ".trend-name, .twitter-hashtag"

    from bs4 import BeautifulSoup as bs
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    d = webdriver.Chrome(r'path\chromedriver.exe')
    d.get('https://twitter.com/explorer?lang=en')
    WebDriverWait(d,5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".trend-name")))
    soup = bs(d.page_source, 'lxml') 
    hashtag_trends = [i.text for i in soup.select('.trend-name:contains("#")')]
    print(hashtag_trends)
    

    或者测试 .text 是否以 # 开头,仅用于 selenium

    from bs4 import BeautifulSoup as bs
    from selenium import webdriver
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    from selenium.webdriver.common.by import By
    
    d = webdriver.Chrome(r'path\chromedriver.exe')
    d.get('https://twitter.com/explorer?lang=en')
    hashtag_trends = [i.text for i in 
        WebDriverWait(d,5).until(EC.presence_of_all_elements_located((By.CSS_SELECTOR, ".trend-name")))
        if i.text.startswith('#')
    ]
    

    【讨论】:

      【解决方案3】:

      对于定位器趋势主题,您可以使用xpath

      driver.find_element(By.XPATH, '(//*[contains(@class,"trend-name")])[1]').text
      driver.find_element(By.XPATH, '(//*[contains(@class,"trend-name")])[1]').click()
      

      您可以通过以下方式获取元素计数:

      len_locator = driver.find_elements(By.XPATH, '//*[contains(@class,"trend-name")]')
      print len(len_locator)
      

      或者如果你只想定位器只以#开头,你可以使用:

      driver.find_element(By.XPATH, '(//*[@dir="ltr" and starts-with(text(), "#")])[1]').text
      driver.find_element(By.XPATH, '(//*[@dir="ltr" and starts-with(text(), "#")])[1]').click
      

      您可以通过以下方式获取元素计数:

      len_locator = driver.find_elements(By.XPATH, '//*[@dir="ltr" and starts-with(text(), "#")]')
      print len(len_locator)
      

      它是热门话题的第一个定位器,如果你想要第二个等等,那么将[1]替换为[2]等。使用迭代来抓取所有。

      【讨论】:

        猜你喜欢
        • 2012-06-15
        • 2016-07-10
        • 1970-01-01
        • 1970-01-01
        • 2021-07-30
        • 1970-01-01
        • 1970-01-01
        • 2016-08-11
        • 2020-11-17
        相关资源
        最近更新 更多