【问题标题】:Python BeautifulSoup webcrawling: Getting text that doesn't have links or class tagsPython BeautifulSoup webcrawling:获取没有链接或类标签的文本
【发布时间】:2015-07-09 23:49:13
【问题描述】:

我要抓取的网站是http://www.boxofficemojo.com/yearly/chart/?yr=2015&p=.htm。 这个网站有一个电影列表,对于每部电影,我想在表格中获取以下信息,不包括日期。

我遇到了这个问题,因为文本没有链接或任何类标签。我已经尝试过使用多种方法,但都没有奏效。

这是我目前使用的一种方法,只是为了获得每部电影的排名。 我希望输出只是由每部电影的排名组成的列表列表,然后是另一个包含每部电影列表、周末总票房等的列表。

listOfRanks = [[1, 1, 1,], [1, 2, 3], [3, 5,1]], etc.
listOfWeekendGross = [[208,806,270,106588440,54200000], [111111111, 222222222, 333333333]]


def getRank(item_url):
    href = item_url[:37]+"page=weekend&" + item_url[37:]
    response = requests.get(href)
    soup = BeautifulSoup(response.content, "lxml")  # or BeautifulSoup(response.content, "html5lib")
    rank = soup.select('tbody > tr > td > center > table > tbody > tr > td > font')
    print rank

这就是我调用这个函数的地方 -

def spider(max_pages):
    url = 'http://www.boxofficemojo.com/yearly/chart/?page=' + str(max_pages) + '&view=releasedate&view2=domestic&yr=2015&p=.htm'
    source_code = requests.get(url)
    plain_text = source_code.text
    soup = BeautifulSoup(plain_text)
    for link in soup.select('td > b > font > a[href^=/movies/?]'):
        href = 'http://www.boxofficemojo.com' + link.get('href')
        getRank(href)

问题在于 getRank(href) 方法没有将排名正确添加到列表中。我认为问题在于这条线 -

    rank = soup.select('tbody > tr > td > center > table > tbody > tr > td > font')

这可能不是获取此文本的正确方法。

我如何从这个网站获得所有排名、周末总收入等?

++++++++++++++++++++++++++++++++++++

【问题讨论】:

    标签: python beautifulsoup web-crawler


    【解决方案1】:

    是的,问题出在您使用的选择器上。你看,那个网站上的标记,嗯,很糟糕。这些表格没有正确编码,实际上缺少 tbody 标签,但 Google Chrome 仍然添加了它们,这就是您在 Web 开发人员工具中看到它们的原因。

    但是,正如我所说,它们不在实际的 HTML 代码中,因此如果您在选择器中使用 tbody,BeautifulSoup 将无法匹配行。看起来该表具有 chart-wide 类,因此您可以使用以下命令定位行:

    rows = soup.select('.chart-wide tr')
    

    之后,您可以遍历那些 rows,跳过第一个(因为那将是标题)并解析其他的和它们各自的单元格。

    类似这样的:

    def getRank(item_url):
        href = item_url[:37]+"page=weekend&" + item_url[37:]
        response = requests.get(href)
        print response.status_code, "for", href
        soup = BeautifulSoup(response.content)  # or BeautifulSoup(response.content, "html5lib")
    
        rows = soup.select('.chart-wide tr')
    
        header_skipped = False
        for row in rows:
            if not header_skipped:
                header_skipped = True
                continue
    
            headers = "Date Rank WeekendGross Change Theaters Change/Avg GrossToDate Week".split()
    
            for header, child in zip(headers, row.children):
                print header, ":", child.text
    

    【讨论】:

    • 由于某种原因,“child.text”行不起作用。我也尝试过 child.string 和 child.getText()。具体错误是 UnicodeEncodeError: 'charmap' codec can't encode character u'\x96' in position 6: character maps to 。如果我只打印标题部分,它可以工作
    • 你确定吗?这是我正在使用的整个脚本,它可以在我的机器上运行:ideone.com/Jt3OCh
    • 我认为编码文件可能有问题,基于 getRank 打印标题中的错误文件“C:/Users/younjin/PycharmProjects/untitled/movies.py”,第 96 行, ":",child.text 文件 "C:\Python27\lib\encodings\cp1252.py",第 12 行,在编码中返回 codecs.charmap_encode(input,errors,encoding_table) UnicodeEncodeError: 'charmap' codec can't encode character u'\x96' 在位置 6:字符映射到
    • 如果我完全复制并粘贴您的代码,我仍然会收到此错误。我在上面发布了一张“第 12 行编码返回”的图片
    • 看起来您的本地编码与网站的不同。它与实际的抓取无关,但无论如何,请尝试使用此处提供的解决方案来处理编码:stackoverflow.com/a/16120218/276451
    【解决方案2】:

    貌似,这个图表表格是动态生成的,使用Phantomjs,一切正常

    from selenium import webdriver
    from bs4 import BeautifulSoup
    driver = webdriver.PhantomJS()
    driver.get('http://www.boxofficemojo.com/movies/?page=weekend&id=jurassicpark4.htm')
    soup = BeautifulSoup(driver.page_source)
    soup.select('table.chart-wide tbody tr td font')
    

    出[1]

    [<font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=date&amp;order=DESC&amp;p=.htm"><b>Date<br>(click to view chart)</br></b></a></font>,
    <font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=rank&amp;order=ASC&amp;p=.htm">Rank</a></font>,
    <font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=wkndgross&amp;order=DESC&amp;p=.htm">Weekend<br>Gross</br></a></font>,
    <font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=perchange&amp;order=DESC&amp;p=.htm">%<br>Change</br></a></font>,
    <font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=theaters&amp;order=DESC&amp;p=.htm">Theaters</a></font>,
    <font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=theaterchange&amp;order=ASC&amp;p=.htm">Change</a> / </font>,
    <font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=avg&amp;order=DESC&amp;p=.htm">Avg.</a></font>,
    <font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=todategross&amp;order=DESC&amp;p=.htm">Gross-to-Date</a></font>,
    <font size="2"><a href="/movies/?page=weekend&amp;id=jurassicpark4.htm&amp;sort=weeknum&amp;order=ASC&amp;p=.htm">Week<br>#</br></a></font>,
    <font size="2"><a href="/weekend/chart/?yr=2015&amp;wknd=24&amp;p=.htm"><b>Jun 12–14</b></a></font>,
    <font size="2">1</font>,
    <font size="2">$208,806,270</font>,
    <font size="2">-</font>,
    <font size="2">4,274</font>,
    .
    .
    .
    <font size="2">$500,373,420</font>,
    <font size="2">3</font>,
    <font size="2"><a href="/weekend/chart/?yr=2015&amp;wknd=27&amp;p=.htm"><b>Jul 3–5</b></a></font>,
    <font size="2">2</font>,
    <font size="2">$29,242,025</font>,
    <font size="2"><font color="#ff0000">-46.4%</font></font>,
    <font color="#ff0000">-46.4%</font>,
    <font size="2">3,737</font>,
    <font size="2"><font color="#ff0000">-461</font></font>,
    <font color="#ff0000">-461</font>,
    <font size="2">$7,825</font>,
    <font size="2">$556,542,980</font>,
    <font size="2">4</font>]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-11
      • 2015-09-10
      • 2015-08-29
      • 1970-01-01
      • 2019-11-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多