python - 如何使用 Selenium 和 Python 在 https://tengrnews.kz 中提取 7 个主要新闻的时间和标题
问题描述
我需要从这个网站上抓取 7 条主要新闻——tengrnews.kz ,每条新闻的日期、时间和标题。我使用 selenium 并安装了 Firefox 开发者版。
我检查了网站,7条新闻位于这个结构中:
<body>
<header> ... some stuff </header>
<main>
<div class="tn-main-news-grid">
<div class="tn-main-news-item firs-column tn-three-column tn-background-cover">
<span class="tn-main-news-title" style="z-index: 1;">BIG MAJOR NEWS TEXT</span>
<a href="/kazakhstan_news/major-news/" class="tn-link"><span class="tn-hidden">BIG MAJOR NEWS TEXT</span></a>
</div>
<div class="tn-main-news-item">
<span class="tn-main-news-title">news1 TEXT</span>
<a href="/kazakhstan_news/news1/" class="tn-link">
<span class="tn-hidden">news1 TEXT</span></a>
</div>
<div class="tn-main-news-item">
<span class="tn-main-news-title">news2 TEXT</span>
<a href="/kazakhstan_news/news2/" class="tn-link">
<span class="tn-hidden">news2 TEXT</span></a>
</div>
<div class="tn-main-news-item">
<span class="tn-main-news-title">news3 TEXT</span>
<a href="/kazakhstan_news/news3/" class="tn-link">
<span class="tn-hidden">news3 TEXT</span></a>
</div>
</div>
</main>
</body>
我通过 xpath 或 css_selector 找到了包含所有 7 个新闻的 div 框架。我确实得到了 Firefox 网页元素,但它是一个列表而且它是空的!
如果我尝试定位单个 href 或 div,它会返回一些“列表”类型的 web 元素,并且这个 href 必须具有文本属性(根据 selenium 文档) - 但它给我错误“无属性文本”
from selenium import webdriver
driver = webdriver.Firefox()
driver.get("https://tengrinews.kz")
css_to_big_news = 'html body div.my-app main section.tn-main-section.tn-container div.tn-main-news-container.tn-sub-container div.tn-main-news-grid div.tn-main-news-item.firs-column.tn-three-column.tn-background-cover a.tn-link'
href_big = driver.find_elements_by_css_selector(css_to_big_news)
print('type of href_big is %s and length is %d' %(type(href_big), len(href_big)))
print(href_big[0].text) #this is wrong
print(href_big.text()) # this is wrong with parenthesis
怎么了?
解决方案
要提取文本,例如TEXT,从每个<span>
使用Selenium和python你必须诱导WebDriverWait forvisibility_of_all_elements_located()
并且你可以使用以下任一Locator Strategies:
使用
CSS_SELECTOR
:driver.get("https://tengrinews.kz/") print("Date and Time:") print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.tn-main-news-grid div.tn-main-news-item ul.tn-data-list>li>span time")))]) print("Title:") print([my_elem.get_attribute("innerHTML") for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "div.tn-main-news-grid div.tn-main-news-item span.tn-main-news-title")))])
使用
XPATH
:driver.get("https://tengrinews.kz/") print("Date and Time:") print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='tn-main-news-grid ']//div[contains(@class, 'tn-main-news-item')]//ul[@class='tn-data-list']/li/span//time")))]) print("Title:") print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.XPATH, "//div[@class='tn-main-news-grid ']//div[contains(@class, 'tn-main-news-item')]//span[@class='tn-main-news-title']")))])
控制台输出:
Date and Time: ['вчера, 18:27', 'вчера, 21:45', 'вчера, 20:52', 'вчера, 19:48', 'вчера, 17:34', 'вчера, 14:50', 'вчера, 14:32'] Title: ['Жара до 42 градусов ожидается в регионах Казахстана', 'Строгий карантин вводят в Мангистауской области', 'Нехватку вакцин и новую "суровую" волну COVID-19 предрекли в мире', 'Столицу Казахстана "оживили"', 'Жители Актау собрались на площади из-за отсутствия лекарств в аптеках', 'Строгий карантин в Нур-Султане продлили до 2 августа', '"Едят антибиотики". Врач из Павлодара объяснил рост числа тяжелых больных']
注意:您必须添加以下导入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
奥特罗
链接到有用的文档:
get_attribute()
方法Gets the given attribute or property of the element.
text
属性返回The text of the element.
- 使用 Selenium 的 text 和 innerHTML 之间的区别
推荐阅读
- java - 将 Clojure 的以向量作为键的映射转换为 java HashMap
- scala - Scaladoc 找不到任何要链接外部 Java 库的成员
- java - 制作多平台项目以在 JDK 8 和 11 中构建和运行
- bash - 如何grep具有时间范围的文件
- python - Pandas groupby 和 sum 同时保留其他属性
- python-3.x - 使用 turicreate 进行对象检测
- kendo-ui - 模板内的 kendoMultiSelect autoClose
- excel - CreateObject for Excel:正常运行有效,以管理员身份运行无效?
- html - 我的 class=float 没有在代码中浮动,整个 html 也没有通过 Google Tagmanager 出现在网站上
- java - 在 JPA 中表示自由形式对象