我是WebCrawling的初学者,我有一个关于抓取多个网址的问题。
我在我的项目中使用CNBC。我想从其主页中提取新闻标题和网址,我还想从每个网址抓取新闻文章的内容。
这是我到目前为止所得到的:
import requests
from lxml import html
import pandas
url = "http://www.cnbc.com/"
response = requests.get(url)
doc = html.fromstring(response.text)
headlineNode = doc.xpath('//div[@class="headline"]')
len(headlineNode)
result_list = []
for node in headlineNode :
url_node = node.xpath('./a/@href')
title = node.xpath('./a/text()')
soup = BeautifulSoup(url_node.content)
text =[''.join(s.findAll(text=True)) for s in soup.findAll("div", {"class":"group"})]
if (url_node and title and text) :
result_list.append({'URL' : url + url_node[0].strip(),
'TITLE' : title[0].strip(),
'TEXT' : text[0].strip()})
print(result_list)
len(result_list)
我一直在收到错误,说'list'对象没有属性'content'。我想创建一个字典,其中包含每个标题的标题,每个标题的网址以及每个标题的新闻文章内容。有没有更简单的方法来解决这个问题?
答案 0 :(得分:3)
脚本开始很好。但是,soup = BeautifulSoup(url_node.content)
是错误的。 url_content
是一个列表。您需要形成完整的新闻URL,使用请求获取HTML,然后将其传递给BeautifulSoup。
除此之外,我还会看到一些事情:
我看到导入问题,没有导入BeautifulSoup。
将from bs4 import BeautifulSoup
添加到顶部。你在用熊猫吗?如果没有,请将其删除。
当您查询url_node = node.xpath('./a/@href')
时,CNN上有一些带有大横幅图片的新闻div会产生0长度列表。您还需要找到适当的逻辑和选择器来获取这些新闻URL。我会把它留给你。
检查出来:
import requests
from lxml import html
import pandas
from bs4 import BeautifulSoup
# Note trailing backslash removed
url = "http://www.cnbc.com"
response = requests.get(url)
doc = html.fromstring(response.text)
headlineNode = doc.xpath('//div[@class="headline"]')
print(len(headlineNode))
result_list = []
for node in headlineNode:
url_node = node.xpath('./a/@href')
title = node.xpath('./a/text()')
# Figure out logic to get that pic banner news URL
if len(url_node) == 0:
continue
else:
news_html = requests.get(url + url_node[0])
soup = BeautifulSoup(news_html.content)
text =[''.join(s.findAll(text=True)) for s in soup.findAll("div", {"class":"group"})]
if (url_node and title and text) :
result_list.append({'URL' : url + url_node[0].strip(),
'TITLE' : title[0].strip(),
'TEXT' : text[0].strip()})
print(result_list)
len(result_list)
奖金调试提示:
启动ipython3 shell并执行%run -d yourfile.py
。查找ipdb
和调试命令。检查您的变量是什么以及您是否正在调用正确的方法非常有帮助。