【问题标题】:How do I draw out specific data from an opened url in Python using urllib2?如何使用 urllib2 从 Python 中打开的 url 中提取特定数据?
【发布时间】:2010-11-02 15:45:55
【问题描述】:

我是 Python 新手,正在制作一个非常基本的网络爬虫。例如,我做了一个简单的函数来加载一个显示在线游戏高分的页面。所以我能够得到html页面的源代码,但是我需要从那个页面中绘制特定的数字。例如,网页如下所示:

http://hiscore.runescape.com/hiscorepersonal.ws?user1=bigdrizzle13

其中“bigdrizzle13”是链接的唯一部分。该页面上的数字需要绘制并返回。本质上,我想构建一个程序,我所要做的就是输入“bigdrizzle13”,它可以输出这些数字。

【问题讨论】:

    标签: python urllib2


    【解决方案1】:

    您可以使用Beautiful Soup 来解析HTML。

    【讨论】:

    • 那只是一个需要导入的模块吗?
    • 您可能需要先下载它,如果它还没有在您的计算机上。但是一旦你这样做了,是的,它只是你导入的一个模块。
    • @Alex,它是第 3 方模块,这意味着它不会自动包含在您的 Python 安装中。按照上面的 BeautifulSoup 链接下载。
    【解决方案2】:

    正如另一张海报所提到的,BeautifulSoup 是完成这项工作的绝佳工具。

    这是完整的、夸张地评论的程序。它可以使用很多容错性,但是只要您输入有效的用户名,它就会从相应的网页中提取所有分数。

    我尽我所能发表评论。如果您不熟悉 BeautifulSoup,我强烈建议您使用 BeautifulSoup documentation 方便地完成我的示例。

    整个程序...

    from urllib2 import urlopen
    from BeautifulSoup import BeautifulSoup
    import sys
    
    URL = "http://hiscore.runescape.com/hiscorepersonal.ws?user1=" + sys.argv[1]
    
    # Grab page html, create BeatifulSoup object
    html = urlopen(URL).read()
    soup = BeautifulSoup(html)
    
    # Grab the <table id="mini_player"> element
    scores = soup.find('table', {'id':'mini_player'})
    
    # Get a list of all the <tr>s in the table, skip the header row
    rows = scores.findAll('tr')[1:]
    
    # Helper function to return concatenation of all character data in an element
    def parse_string(el):
       text = ''.join(el.findAll(text=True))
       return text.strip()
    
    for row in rows:
    
       # Get all the text from the <td>s
       data = map(parse_string, row.findAll('td'))
    
       # Skip the first td, which is an image
       data = data[1:]
    
       # Do something with the data...
       print data
    

    这是一个测试运行。

    > test.py bigdrizzle13
    [u'Overall', u'87,417', u'1,784', u'78,772,017']
    [u'Attack', u'140,903', u'88', u'4,509,031']
    [u'Defence', u'123,057', u'85', u'3,449,751']
    [u'Strength', u'325,883', u'84', u'3,057,628']
    [u'Hitpoints', u'245,982', u'85', u'3,571,420']
    [u'Ranged', u'583,645', u'71', u'856,428']
    [u'Prayer', u'227,853', u'62', u'357,847']
    [u'Magic', u'368,201', u'75', u'1,264,042']
    [u'Cooking', u'34,754', u'99', u'13,192,745']
    [u'Woodcutting', u'50,080', u'93', u'7,751,265']
    [u'Fletching', u'53,269', u'99', u'13,051,939']
    [u'Fishing', u'5,195', u'99', u'14,512,569']
    [u'Firemaking', u'46,398', u'88', u'4,677,933']
    [u'Crafting', u'328,268', u'62', u'343,143']
    [u'Smithing', u'39,898', u'77', u'1,561,493']
    [u'Mining', u'31,584', u'85', u'3,331,051']
    [u'Herblore', u'247,149', u'52', u'135,215']
    [u'Agility', u'225,869', u'60', u'276,753']
    [u'Thieving', u'292,638', u'56', u'193,037']
    [u'Slayer', u'113,245', u'73', u'998,607']
    [u'Farming', u'204,608', u'51', u'115,507']
    [u'Runecraft', u'38,369', u'71', u'880,789']
    [u'Hunter', u'384,920', u'53', u'139,030']
    [u'Construction', u'232,379', u'52', u'125,708']
    [u'Summoning', u'87,236', u'64', u'419,086']
    

    瞧 :)

    【讨论】:

    • 请耐心听我说。那么这些分数的 html 是在表格中给出的?而soup.find('table'... 可以在该表中提取某些值?你怎么知道要查找'mini_player'/什么是'mini_player'?提前谢谢。
    • 非常令人印象深刻。我还不明白大部分代码。不过正在努力。
    • mini_player 是 HTML 表格元素的 ID 属性,其中包含您想要从该页面获得的分数。我知道要查找“min​​i_player”,因为我查看了 HTML 页面的源代码,那是保存分数的表的 id。
    • 和soup.find() 有一种模式可以从表格中绘制某些行或列?什么是'tr'?
    • 是的,Alex、find() 和 findAll 可以选择匹配特定条件的给定元素的一个或所有子元素。在这种情况下,根元素是“table”,子元素是第一行(“tr”=“table row”),然后是单元格(“td”=“table data”)。干得好,三联画。
    猜你喜欢
    • 1970-01-01
    • 2022-01-17
    • 2016-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 1970-01-01
    相关资源
    最近更新 更多