使用BeautifulSoup从tbody中提取数据

时间:2017-04-06 21:15:40

标签: python beautifulsoup

我正在尝试使用BeautifulSoup从此HTML中提取一些数据。我只想返回data-buyout="1 alchemy" data-ign="DanForeverr" data-league="Standard" data-name="Sulphur Wastes Map" data-seller="NoCocent" data-sellerid="None" data-tab="~price 1 alch" data-x="6" data-y="7" *`,但我没有得到任何结果。我正在使用下面的代码。任何帮助将不胜感激。

parsed = soup.find_all('tbody', class=re.compile('^data-'))
<tbody class="item item-live-c324ceb98e25716a0fad0727e0cd64e3" data-buyout="1 alchemy" data-ign="DanForeverr" data-league="Standard" data-name="Sulphur Wastes Map" data-seller="NoCocent" data-sellerid="None" data-tab="~price 1 alch" data-x="6" data-y="7" id="item-container-0">
 <tr class="first-line">
  <td class="icon-td">
   <div class="icon">
    <img alt="Item icon" src="https://web.poecdn.com/image/Art/2DItems/Maps/AtlasMaps/SulphurWastes3.png?scale=1&amp;w=1&amp;h=1&amp;v=48802019c4a2e88af038d75ec1e4b31e3"/>
    \n
    <div class="sockets" style="position: absolute;">
     \n
     <div class="sockets-inner" style="position: relative; width:94px;">
      \n
     </div>
     \n
    </div>
   </div>
  </td>
  <td class="item-cell">
   <h5>
    <a class="title itemframe0" href="#" onclick="return false;" target="_blank">
     Sulphur Wastes Map
    </a>
    <span class="found-time-ago">
     2 months ago
    </span>
   </h5>
   <ul class="requirements proplist">
    <li>
     <span class="sortable" data-name="ilvl">
      ilvl: 80
     </span>
    </li>
   </ul>
   <span class="sockets-raw" style="display:none">
   </span>
   <ul class="item-mods">
   </ul>
  </td>
  <td class="table-stats">
   <table>
    <tr class="calibrate">
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
     <th>
     </th>
    </tr>
    <tr class="cell-first">
     <th class="disabled" colspan="2">
      Quality
     </th>
     <th class="disabled" colspan="2">
      Phys.
     </th>
     <th class="disabled" colspan="2">
      Elem.
     </th>
     <th class="disabled" colspan="2">
      APS
     </th>
     <th class="disabled" colspan="2">
      DPS
     </th>
     <th class="disabled" colspan="2">
      pDPS
     </th>
     <th class="disabled" colspan="2">
      eDPS
     </th>
    </tr>
    <tr class="cell-first">
     <td class="sortable property " colspan="2" data-name="q" data-value="0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="pd" data-value="0.0">
     </td>
     <td class="sortable property " colspan="2" data-ed="" data-name="ed" data-value="0.0">
     </td>
     <td class="sortable property " colspan="2" data-name="aps" data-value="0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="dps" data-value="0.0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="pdps" data-value="0.0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="edps" data-value="0.0">
      \xa0
     </td>
    </tr>
    <tr class="cell-second">
     <th class="cell-empty">
     </th>
     <th class="disabled" colspan="2">
      Armour
     </th>
     <th class="disabled" colspan="2">
      Evasion
     </th>
     <th class="disabled" colspan="2">
      Shield
     </th>
     <th class="disabled" colspan="2">
      Block
     </th>
     <th class="disabled" colspan="2">
      Crit.
     </th>
     <th colspan="2">
      Tier
     </th>
    </tr>
    <tr class="cell-second">
     <td class="cell-empty">
     </td>
     <td class="sortable property " colspan="2" data-name="armour" data-value="0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="evasion" data-value="0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="shield" data-value="0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="block" data-value="0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="crit" data-value="0">
      \xa0
     </td>
     <td class="sortable property " colspan="2" data-name="level" data-value="13">
      13
     </td>
    </tr>
   </table>

3 个答案:

答案 0 :(得分:0)

嗯,你真的不能那样做,你可以从那个标签中提取特定信息,如。

定义x = html您发布的内容如下:x = '''<tbody class="item item-live-c324ceb98e25716a0fad0727e0cd64e3" data-buyout="1 alchemy" data-ign="DanForeverr" data-league="Standard" data-name="Sulphur Wastes Map" data-seller="NoCocent" data-sellerid="None" data-tab="~price 1 alch" data-x="6" data-y="7" id="item-container-0">'''

soup = BeautifulSoup(x,'lxml')

this_class = soup.findAll('tbody',{'class':'item item-live-c324ceb98e25716a0fad0727e0cd64e3'})
#This is used to pinpoint the exact tbody (you can do it your way),
# but it's useful because you give it the exacty key-value. (Mostly can't miss)

for i in this_class:
    print(i['data-buyout'])
    print(i['data-ign'])
    print(i['data-name'])
    print(i['id'])

您可以打印这些属性的每个值,但如果您使用 soup.findAllsou.find,则 NOT 仅打印(< em>一个)分支,还有整个 (儿童)

答案 1 :(得分:0)

您正在尝试在标记类中查找标记属性,但这不起作用。

为什么不通过ID找到它?只需确保它包含0之前的子字符串。

soup.select("tbody[id*=item-container-]")

答案 2 :(得分:0)

以下的组合解决了我的问题

parsed = soup.select("tbody[id*=item-container-]")
for i in parsed:
    print(i['data-buyout'])
    print(i['data-ign'])
    print(i['data-name'])
    print(i['id'])