извлечь несколько "td" классов из таблицы - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть сайт с множеством таблиц, и я перебираю их, получаю данные из всех таблиц и экспортирую их в CSV-файл. У меня проблема в том, что в каждой таблице есть несколько классов 'td', и я хочу только пару из них, но я не знаю, как сузить их до того, что я хочу. когда я запускаю свой текущий код, я получаю лишние части таблицы, которые мне не нужны, и это делает мой CSV-файл очень грязным. Вот фрагмент кода html для страницы, содержащей информацию, которую я хочу.

<tr class="table_title">
  <td class="sportPicksBorderL2 tanBg fourleft regular" nowrap="nowrap">
    607 <a class="black" href="/college-basketball/teams/team-page.cfm/team/oakland">OAKLND</a>
  </td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">&nbsp;136.5&nbsp;</td>

  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">28</td>

  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">32</td>


  <td class="sportPicksBorderL2 tanBg zerocenter sub_title_red" nowrap="nowrap">60</td>

  <td class="sportPicksBorderR2 tanBg zerocenter regular" nowrap="nowrap" width="100">Cover: +1.5&nbsp;</td>

</tr>
<tr class="table_title">
  <td class="sportPicksBorderL2 tanBg fourleft regular" nowrap="nowrap">
    608 <a class="black" href="/college-basketball/teams/team-page.cfm/team/youngstown-state">YOUNG</a> <span class="sub_title_red">«</span>
  </td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">&nbsp;-2.5&nbsp;</td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">24</td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">37</td>

  <td class="sportPicksBorderL2 tanBg zerocenter sub_title_red" nowrap="nowrap">61</td>

  <td class="sportPicksBorderR2 tanBg zerocenter regular" nowrap="nowrap" width="100">Under: 121&nbsp;</td>

</tr>

Вот то, что я запускаю, чтобы извлечь мои данные

import bs4 as bs
import urllib.request
from requests import get
import pandas as pd
from csv import writer
url = 'https://www.vegasinsider.com/college-basketball/scoreboard/scores.cfm/game_date/01-12-2020'
source = urllib.request.urlopen(url)
soup = bs.BeautifulSoup(source, 'lxml')
tables = soup.find_all('table', attrs={'class': 'sportPicksBorder'})
filename = 'C:\\Users\\mylocation\\Documents\\tables.csv'
with open(filename, 'w')as f:
    data = []
    csv_writer = writer(f)
    for table in tables:
        rows = table.find_all('tr')
        for row in rows:
            columns = row.find_all('td')
            csv_writer.writerow([column.text.strip() for column in columns])

что я хочу - это класс = "черный" / a, в котором есть моя команда имя без красной стрелки, написанное им class = sportPicksBorderL2 class = sportPicksBorderR2

Мой оригинальный код возвращает эти 4 строки для каждой таблицы.

Final Score Score                                                   
Teams   Odds    1   2   T   ATS                                 
847 ARIZNA  -4  31  34  65  Over: 147                                   
848 OREGST «   143.5   31  51  82  Cover: +21

Я хотел бы уклониться от этого.

ARIZNA  -4  31  34  65  Over: 147                                   
OREGST 143.5 31 51  82  Cover: +21

Я хочу убрать Â «, числа перед именами команд и первые 2 строки таблицы из того, что я собираю, но все еще являюсь новичком в изучении веб-страниц и python, мне трудно понять. Если у кого-то есть хороший учебный ресурс, я весь в ушах.

Ответы [ 3 ]

0 голосов
/ 04 февраля 2020

Другое решение.

from simplified_scrapy.spider import SimplifiedDoc 
html='''
<table class="sportPicksBorder">
 <tr class="table_title">
  <td class="sportPicksBorderL2 tanBg fourleft regular" nowrap="nowrap">
    607 <a class="black" href="/college-basketball/teams/team-page.cfm/team/oakland">OAKLND</a>
  </td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">&nbsp;136.5&nbsp;</td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">28</td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">32</td>
  <td class="sportPicksBorderL2 tanBg zerocenter sub_title_red" nowrap="nowrap">60</td>
  <td class="sportPicksBorderR2 tanBg zerocenter regular" nowrap="nowrap" width="100">Cover: +1.5&nbsp;</td>
</tr>
<tr class="table_title">
  <td class="sportPicksBorderL2 tanBg fourleft regular" nowrap="nowrap">
    608 <a class="black" href="/college-basketball/teams/team-page.cfm/team/youngstown-state">YOUNG</a> <span class="sub_title_red">«</span>
  </td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">&nbsp;-2.5&nbsp;</td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">24</td>
  <td class="sportPicksBorderL2 tanBg zerocenter regular" nowrap="nowrap">37</td>
  <td class="sportPicksBorderL2 tanBg zerocenter sub_title_red" nowrap="nowrap">61</td>
  <td class="sportPicksBorderR2 tanBg zerocenter regular" nowrap="nowrap" width="100">Under: 121&nbsp;</td>
</tr>
</table>
'''
doc = SimplifiedDoc(html) # create doc
tables = doc.getElementsByClass('sportPicksBorder')
# If you only want to include 'td' of 'a' and remove the arrow at the back, you can do this
for table in tables:
    rows = table.trs
    for row in rows:
        column = row.td # Get the first td
        column.removeElement('span') # Delete that arrow
        print (column.text)
        # You can do the same
        print (column.firstText(),column.a.text)

Результат:

607 OAKLND
607 OAKLND
608 YOUNG
608 YOUNG

Вот еще примеры: https://github.com/yiyedata/simplified-scrapy-demo/blob/master/doc_examples/

0 голосов
/ 05 февраля 2020

Я обнаружил, что в моих столбцах l oop мне нужно было отформатировать код таким образом, чтобы найти только те значения, которые мне нужны c 'td *

columns = row.find_all(class_=["black", "sportPicksBorderL2 tanBg zerocenter regular", "sportPicksBorderL2 tanBg zerocenter sub_title_red", "sportPicksBorderR2 tanBg zerocenter regular"])

Использование find_all для поиска всех Затем я использовал class_, чтобы просмотреть все эти классы, чтобы найти те, которые хотели, мне нужно было разделить их запятыми, а затем поместить их в порядок, который я хочу, чтобы они отображались в моем файле csv.

0 голосов
/ 04 февраля 2020

вы хотите следующее:

var blacks = document.getElementsByClassName('black');

var blacks будет массивом, и вы можете получить доступ к каждому элементу следующим образом:

for(i = 0; i< blacks.length;i++){
    var black = blacks[i];
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...