我想在python3上使用selenium从twitter页面中提取标签名称(Hashtag)。但是没有特殊的标签或类,甚至没有ids能够定位和保存它们。
有没有一种方法,即使它们改变了,我也可以提取它们,而不必每次都编辑我的代码?
我认为下面的代码将把我带到使用链接文本的explore页面。但我不能使用相同的方法来定位标签,因为它们会时不时地变化。
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>
这些类不是唯一的,它们在页面的其他元素中使用,所以我不能使用它们。
如果有一种方法可以定位(#)标记,那么我只能获得包含它们的文本。
发布于 2019-08-17 21:35:21
要从twitter页面中提取标签,即在Python3上使用Selenium的https://twitter.com/explorer?lang=en
,您必须为visibility_of_all_elements_located()
引入WebDriverWait,您可以使用以下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,"ahref^='/hashtag'>span.trend-name")))])
XPATH
:hashtag(“https://twitter.com/explorer?lang=en") print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver,'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',‘#11 11YearsOFViratism’,'#ManCity'
发布于 2019-08-17 13:09:01
你可以将页面源码转储到漂亮汤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('#')
]
发布于 2019-08-18 00:42:19
对于定位器趋势主题,您可以使用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]
等。使用迭代来获取全部。
https://stackoverflow.com/questions/57536127
复制