从新闻网站中提取用户评论
Posted
技术标签:
【中文标题】从新闻网站中提取用户评论【英文标题】:Extracting user comments from news website 【发布时间】:2016-08-16 09:08:32 【问题描述】:from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
def wait(dr, x):
element = WebDriverWait(dr, 50).until(
EC.presence_of_all_elements_located((By.XPATH, x))
)
return element
from selenium import webdriver
browser = webdriver.Firefox()
browser.get("http://www.dinamalar.com/user_comments.asp? uid=14701&name=%E0%AE%A4%E0%AE%AE%E0%AE%BF%E0%AE%B4%E0%AF%8D%E0%AE%9A%E0%AF%86%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%A9%E0%AF%8D")
for elem in wait(browser, '//*[@id="commsec"]/div[2]/div[1]'):
print elem.text
这是我需要提取所有 cmets http://www.dinamalar.com/user_comments.asp?uid=14701&name=%E0%AE%A4%E0%AE%AE%E0%AE%BF%E0%AE%B4%E0%AF%8D%E0%AE%9A%E0%AF%86%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%A9%E0%AF%8D的链接
但是我的代码只提取了前 10 个 cmets。单击按钮后,将动态加载其他 10 个 cmets。如何使用 python selenium 提取所有这些 cmets
【问题讨论】:
【参考方案1】:这个想法是寻找页面上存在多少“更多想法”元素。每次单击按钮并加载更多 cmets 时,就会出现一个“更多想法”红色按钮。实施:
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium import webdriver
browser = webdriver.Firefox()
wait = WebDriverWait(browser, 10)
browser.get("http://www.dinamalar.com/user_comments.asp?uid=14701&name=%E0%AE%A4%E0%AE%AE%E0%AE%BF%E0%AE%B4%E0%AF%8D%E0%AE%9A%E0%AF%86%E0%AE%B2%E0%AF%8D%E0%AE%B5%E0%AE%A9%E0%AF%8D")
# initial wait for the page to load
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".morered")))
pages = 1
while True:
browser.find_elements_by_css_selector(".morered")[-1].click()
# wait for more "load more" buttons to be present
try:
wait.until(lambda browser: len(browser.find_elements_by_css_selector(".morered")) > pages)
except TimeoutException:
break # no more data loaded, exit the loop
print("Comments loaded: %d" % len(browser.find_elements_by_css_selector(".dateg")))
pages += 1
browser.close()
请注意,我还删除了 URL 中的多余空间。
【讨论】:
谢谢,工作正常。我是初学者,所以如何获得 cmets @VinayakumarR 我会在这里使用 XPath:comments = [element.text for element in browser.find_elements_by_xpath("//div[@class='boxcmt1']//a[@class='heading']/following-sibling::div")]
。请测试。谢谢。
将此行添加到现有代码后,显示警告 I/O 警告 Non ASCII found,但我尝试运行它,它显示错误
这很好用 cmets = [element.text for element in browser.find_elements_by_xpath("//div[@class='boxcmt1']//a[@class='heading']")]但它返回 unicode
@VinayakumarR 当然,但 unicode 有什么问题?谢谢。以上是关于从新闻网站中提取用户评论的主要内容,如果未能解决你的问题,请参考以下文章
BeautifulSoup 从评论 html 中提取文本 [重复]