有关使用Python浏览新闻标题和内容的示例

时间:2017-04-12 02:27:03

标签: python xpath beautifulsoup web-crawler

我是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'。我想创建一个字典,其中包含每个标题的标题,每个标题的网址以及每个标题的新闻文章内容。有没有更简单的方法来解决这个问题?

1 个答案:

答案 0 :(得分:3)

脚本开始很好。但是,soup = BeautifulSoup(url_node.content)是错误的。 url_content是一个列表。您需要形成完整的新闻URL,使用请求获取HTML,然后将其传递给BeautifulSoup。

除此之外,我还会看到一些事情:

  1. 我看到导入问题,没有导入BeautifulSoup。 将from bs4 import BeautifulSoup添加到顶部。你在用熊猫吗?如果没有,请将其删除。

  2. 当您查询url_node = node.xpath('./a/@href')时,CNN上有一些带有大横幅图片的新闻div会产生0长度列表。您还需要找到适当的逻辑和选择器来获取这些新闻URL。我会把它留给你。

  3. 检查出来:

    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和调试命令。检查您的变量是什么以及您是否正在调用正确的方法非常有帮助。

    祝你好运。