我正在做一个Python练习,它要求我通过网页抓取从Google新闻网站获取头条新闻并打印到控制台。 当我这样做时,我只是使用美丽汤图书馆来检索新闻。那是我的代码:
import bs4
from bs4 import BeautifulSoup
import urllib.request
news_url = "https://news.google.com/news/rss";
URLObject = urllib.request.urlopen(news_url);
xml_page = URLObject.read();
URLObject.close();
soup_page = BeautifulSoup(xml_page,"html.parser");
news_list = soup_page.findAll("item");
for news in news_list:
print(news.title.text);
print(news.link.text);
print(news.pubDate.text);
print("-"*60);
但是它一直给我错误,因为它没有打印"链接"和"pubDate"。经过一番研究,我在Stack Overflow上看到了一些答案,他们说,由于该网站使用Javascript,除了Beautiful Soup之外,还应该使用Selenium软件包。 尽管不了解Selenium的真正工作原理,但我还是更新了代码,如下所示:
from bs4 import BeautifulSoup
from selenium import webdriver
import urllib.request
driver = webdriver.Chrome("C:/Users/mauricio/Downloads/chromedriver");
driver.maximize_window();
driver.get("https://news.google.com/news/rss");
content = driver.page_source.encode("utf-8").strip();
soup = BeautifulSoup(content, "html.parser");
news_list = soup.findAll("item");
print(news_list);
for news in news_list:
print(news.title.text);
print(news.link.text);
print(news.pubDate.text);
print("-"*60);
但是,当我运行它时,会打开一个空白的浏览器页面,并将其打印到控制台:
raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.WebDriverException: Message: unknown error: Chrome failed to start: crashed
(Driver info: chromedriver=2.38.551601 (edb21f07fc70e9027c746edd3201443e011a61ed),platform=Windows NT 6.3.9600 x86_64)
我刚刚尝试过,以下代码对我有用。items =
线很糟糕,提前道歉。但就目前而言,它有效...
编辑刚刚更新了代码片段,您可以使用ElementTree.iter('tag')
遍历具有该tag
的所有节点:
import urllib.request
import xml.etree.ElementTree
news_url = "https://news.google.com/news/rss"
with urllib.request.urlopen(news_url) as page:
xml_page = page.read()
# Parse XML page
e = xml.etree.ElementTree.fromstring(xml_page)
# Get the item list
for it in e.iter('item'):
print(it.find('title').text)
print(it.find('link').text)
print(it.find('pubDate').text, 'n')
编辑2:讨论库抓取
的个人偏好 就个人而言,对于我必须在其中做事的交互式/动态页面(单击此处,填写表格,获取结果,...):我使用selenium
,通常我不需要使用bs4
,因为您可以直接使用Selenium来查找和解析您正在寻找的网络的特定节点。
我将bs4
与requests
结合使用(而不是urllib.request
),以便在我不想安装整个Web驱动程序的项目中解析更多静态网页。
使用urllib.request
没有错,但是requests
(请参阅此处的文档)是最好的python包之一(在我看来),并且是如何创建简单而强大的API的一个很好的例子。
只需将BeautifulSoup
与requests
一起使用即可。
from bs4 import BeautifulSoup
import requests
r = requests.get('https://news.google.com/news/rss')
soup = BeautifulSoup(r.text, 'xml')
news_list = soup.find_all('item')
# do whatever you need with news_list