如何使用Selenium爬取路透社新闻链接对应的完整正文内容
问题说明
- 需要提取路透社新闻链接的完整报道内容,示例链接:https://www.reuters.com/world/europe/navalny-allies-accuse-telegram-censorship-russian-election-2021-09-18/
- 已实现Selenium代码爬取路透社个股页面的新闻链接,目前无法定位正文的正确XPath,且新闻正文拆分在多个
<p>标签中,需要解决正文提取的问题。
现有代码
!pip install selenium !apt-get update !apt install chromium-chromedriver from selenium import webdriver import time chrome_options = webdriver.ChromeOptions() chrome_options.add_argument('--headless') chrome_options.add_argument('--no-sandbox') chrome_options.add_argument('--disable-dev-shm-usage') driver = webdriver.Chrome('chromedriver',chrome_options=chrome_options) driver.maximize_window() driver.implicitly_wait(10) driver.get("https://www.reuters.com/companies/AAPL.O") links=[] i=0 try: while True: news = driver.find_elements_by_xpath("//div[@class='item']") driver.execute_script("arguments[0].scrollIntoView(true);", news[i]) if news[i].find_element_by_tag_name("time").get_attribute("innerText") == "a year ago": break links.append(news[i].find_element_by_tag_name("a").get_attribute("href")) i += 1 time.sleep(.5) except: pass driver.quit()
正文提取方案
路透社新闻页的正文所有<p>标签都统一嵌套在带article-body__content__前缀的class的div容器中,你可以直接定位该容器后批量获取所有p标签的内容拼接即可,不需要单独给每个p写XPath。
在现有代码获取完links列表后,补充以下代码即可实现正文提取:
def get_reuters_content(url): driver.get(url) time.sleep(1) try: # 匹配正文外层容器,用contains避免class后缀动态变化导致定位失效 content_wrapper = driver.find_element_by_xpath("//div[contains(@class, 'article-body__content__')]") # 获取容器下所有p标签 p_tags = content_wrapper.find_elements_by_tag_name("p") # 拼接所有非空的p标签文本 full_text = "\n".join([tag.text.strip() for tag in p_tags if tag.text.strip()]) return full_text except: return "正文提取失败" # 重新初始化driver用于提取正文 driver = webdriver.Chrome('chromedriver',chrome_options=chrome_options) driver.implicitly_wait(10) # 遍历所有链接提取正文 news_result = [] for link in links: news_result.append({ "url": link, "content": get_reuters_content(link) }) time.sleep(0.5) driver.quit() # 打印结果测试 for news in news_result: print(f"新闻链接:{news['url']}") print(f"新闻正文:\n{news['content']}") print("-"*80)
注意事项
- 如果遇到页面加载慢的情况,可以把
time.sleep(1)的等待时长调长,或者替换为显式等待逻辑 - 遇到付费墙拦截的新闻,该方法无法提取到完整正文,属于正常情况
内容的提问来源于stack exchange,提问作者huy
相关产品推荐
相关产品推荐

