桌子和美丽的汤问题

时间:2013-11-28 00:13:20

标签: python beautifulsoup

我正在尝试嵌套在tr标签中的标签,但我用来查找正确值的标识符嵌套在tr标签内的另一个td中。

也就是说,我正在使用网站LoLKing

试图根据名称来搜索统计数据,例如,Ahri。

HTML是:

<tr>
            <td data-sorttype="string" data-sortval="Ahri" style="text-align: left;">
                <div style="display: table-cell;">
                <div class="champion-list-icon" style="background:url(//lkimg.zamimg.com/shared/riot/images/champions/103_32.png)">
                    <a style="display: inline-block; width: 28px; height: 28px;" href="/champions/ahri"></a>
                </div>
                </div>
                <div style="display: table-cell; vertical-align: middle; padding-top: 3px; padding-left: 5px;"><a href="/champions/ahri">Ahri</a></div>
            </td>
            <td style="text-align: center;"  data-sortval="975"><img src='//lkimg.zamimg.com/images/rp_logo.png' width='18' class='champion-price-icon'>975</td>
            <td style="text-align: center;" data-sortval="6300"><img src='//lkimg.zamimg.com/images/ip_logo.png' width='18' class='champion-price-icon'>6300</td>
            <td style="text-align: center;" data-sortval="10.98">10.98%</td>
            <td style="text-align: center;" data-sortval="48.44">48.44%</td>
            <td style="text-align: center;" data-sortval="18.85">18.85%</td>
            <td style="text-align: center;" data-sorttype="string" data-sortval="Middle Lane">Middle Lane</td>
            <td style="text-align: center;" data-sortval="1323849600">12/14/2011</td>
        </tr> 

我在提取统计数据时遇到问题,这些统计数据嵌套在data-sortval之外的td标记中。我想我想要拉出所有的tr标签,但是我不知道如何根据包含td标签的tr标签和data-sortval =“Ahri”来拉动tr标签。那时,我想逐步通过tr标签x次,直到达到我想要的第一个统计数据,10.98

目前,我正在尝试使用data-sortval Ahri查找td,但它不会返回tr的其余部分。

如果更大的标签:

,并非所有这些都嵌套在内部可能很重要
  <table class="clientsort champion-list" width="100%" cellspacing="0" cellpadding="0">
    <thead>
    <tr><th>Champion</th><th>RP Cost</th><th>IP Cost</th><th>Popularity</th><th>Win Rate</th><th>Ban Rate</th><th>Meta</th><th>Released</th></tr>     
    </thead>
    <tbody>

我为缺乏清晰度而道歉,我是这个刮擦术语的新手,但我希望这有足够的意义。 现在,我也在做:

main = soup.find('table', {'class':'clientsort champion-list'})

只获得该表

编辑:

我为变量键入了这个:

for champ in champs:
    a = str(champ)
    print type(a) is str
    td_name = soup.find('td',{"data-sortval":a})

它确认a是一个字符串。 但它抛出了这个错误:

  File "lolrec.py", line 82, in StatScrape
    tr = td_name.parent
AttributeError: 'NoneType' object has no attribute 'parent'

1 个答案:

答案 0 :(得分:4)

GO LOL!

出于商业目的,请在抓取前阅读服务条款。

(1)要抓取一个英雄列表,你可以这样做,这遵循你所描述的类似逻辑。

from bs4 import BeautifulSoup
import urllib2
html = urllib2.urlopen('http://www.lolking.net/champions/')
soup = BeautifulSoup(html)
# locate the cell that contains hero name: Ahri 
hero_list = ["Blitzcrank", "Ahri", "Akali"]
for hero in hero_list:
    td_name = soup.find('td', {"data-sortval":hero})
    tr = td_name.parent
    popularity = tr.find_all('td', recursive=False)[3].text
    print hero, popularity

输出

Blitzcrank 12.58%
Ahri 10.98%
Akali 7.52%

输出

10.98%

(2)刮掉所有的英雄。

from bs4 import BeautifulSoup
import urllib2
html = urllib2.urlopen('http://www.lolking.net/champions/')
soup = BeautifulSoup(html)
# find the table first
table = soup.find('table', {"class":"clientsort champion-list"})
# find the all the rows
for row in table.find('tbody').find_all("tr", recursive=False):
    cols = row.find_all("td")
    hero = cols[0].text.strip()
    popularity = cols[3].text
    print hero, popularity

输出:

Aatrox 6.86%
Ahri 10.98%
Akali 7.52%
Alistar 4.9%
Amumu 8.75%
...