【问题标题】:Why is the code not able to scrape any content in the HTML class?为什么代码无法抓取 HTML 类中的任何内容?
【发布时间】:2018-05-24 16:45:50
【问题描述】:

我可以在inspect 期间看到内容位于article-wrap 类中,如屏幕截图中突出显示的那样:

但是当我尝试抓取其中的文本内容时,我什么也得不到:

这是为什么呢?我是否错误地指定了班级?如果是这样,我需要指定哪个类?知道我应该指定哪个类(或标签,或 div 等)的最简单方法是什么?

这是代码:

import requests

links = open("article links.txt", "r")

for a in links:
    page = requests.get(a)
    soup = BeautifulSoup(page.text, 'lxml')

    html = soup.find(class_="article-wrap")

    print(html)

【问题讨论】:

  • 我测试了您的代码并且它正在工作。您能否打印出循环中的链接以实际检查链接是否有效并指向具有实际 article-wrap div 的页面?我刚刚使用了一篇文章的单个链接。
  • 可以给个网址吗?
  • @Kristada673 在你给我的例子中,类是:“mag-article-wrap”
  • @Kristada673 超级,考虑自己写下答案并接受它:)
  • @Kristada673,很高兴听到它对你有用 :)

标签: python html web-scraping beautifulsoup scrapy


【解决方案1】:

使用 BeautifulSoup 的 .select() 方法要容易得多,类似于 css 选择器,如下所示:

import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36'}

links = open("article links.txt", "r")

for a in links:
    r = requests.get(a, headers=headers, timeout=10)

    soup = BeautifulSoup(r.text, 'html.parser')

    results = soup.select(".article-wrap"):

    print(results)

我在我的电脑上测试过。效果很好。

【讨论】:

    【解决方案2】:

    其实是两件事:

    首先,在article links.txt 中,每个链接都在一个新行中(即以\n 结尾)。所以,我必须在page = requests.get(a) 之前做a=a.rstrip() 才能得到正确的汤。没有条带,如果我打印出汤,它看起来像这样:

    >>> page = requests.get('http://www3.asiainsurancereview.com//Mock-News-Article/id/42945/Type/eDaily/New-Zealand-Govt-starts-public-consultation-phase-of-review-of-insurance-law\n')
    >>> page
    <Response [400]>
    >>> page.text
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN""http://www.w3.org/TR/html4/strict.dtd">
    <HTML><HEAD><TITLE>Bad Request</TITLE>
    <META HTTP-EQUIV="Content-Type" Content="text/html; charset=us-ascii"></HEAD>
    <BODY><h2>Bad Request - Invalid URL</h2>
    <hr><p>HTTP Error 400. The request URL is invalid.</p>
    </BODY></HTML>
    

    可以看出,如果不剥离每个链接末尾的\n,它就无法提取页面中的信息(特别是它提取的汤中没有标签artcle-wrap)。

    其次,我添加了两个 html 类,article-wrapmag-article-wrap 以适应两种不同类型的文章:

    html = soup.find(class_='article-wrap')
    if html==None:
        html = soup.find(class_='mag-article-wrap')
    
    text = get_text(html.text)
    

    现在可以正常使用了。

    【讨论】:

      猜你喜欢
      • 2014-01-04
      • 2019-06-12
      • 2020-04-27
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      相关资源
      最近更新 更多