У меня на сайте есть таблица, похожая на эту:

<table class="table-class">
  <thead>
    <tr>
      <th>Col 1</th>
      <th>Col 2</th>
      <th>Col 3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
     <td>Hello</td>
     <td>A number</td>
     <td>Another number<td>
   </tr>
   <tr>
     <td>there</td>
     <td>A number</td>
     <td>Another number<td>
   </tr>
  </tbody>
</table>

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

Я предполагаю, что должен использовать что-то вроде find_elements_by_xpath(...) или что-то подобное, но я действительно ударился об стену с этим. Я попробовал несколько подходов, предложенных на других сайтах, и, кажется, делаю больше вещей неправильно, чем правильно. Любые предложения или идеи будут высоко оценены!

То, что у меня есть, хотя и не работает и основано на другом вопросе, это:

listoflist = [[td.text
                for td in tr.find_elements_by_xpath('td')]
                for tr in driver.find_elements_by_xpath("//table[@class='table-class')]//tr"]
listofdict = [dict(zip(list_of_lists[0],row)) for row in list_of_lists[1:]]

Заранее спасибо!

Vham

0
vham 22 Мар 2017 в 19:04

2 ответа

Лучший ответ

В зависимости от веб-сайта, к которому вы пытаетесь получить доступ, вам может не понадобиться заходить так далеко, как вам нужен селен. Вы можете просто получить доступ к html используя requests.

Для предоставленного вами HTML-кода вы можете использовать BeautifulSoup для извлечения информации о таблице следующим образом:

from bs4 import BeautifulSoup

html = """
<table class="table-class">
  <thead>
    <tr>
      <th>Col 1</th>
      <th>Col 2</th>
      <th>Col 3</th>
    </tr>
  </thead>
  <tbody>
    <tr>
     <td>Hello</td>
     <td>A number</td>
     <td>Another number<td>
   </tr>
   <tr>
     <td>there</td>
     <td>A number</td>
     <td>Another number<td>
   </tr>
  </tbody>
</table>"""

soup = BeautifulSoup(html, "html.parser")
rows = []

for tr in soup.find_all('tr'):
    cols = []
    for td in tr.find_all(['td', 'th']):
        td_text = td.get_text(strip=True)
        if len(td_text):
            cols.append(td_text)
    rows.append(cols)

print rows

Даю вам rows холдинг:

[[u'Col 1', u'Col 2', u'Col 3'], [u'Hello', u'A number', u'Another number'], [u'there', u'A number', u'Another number']]

Чтобы использовать requests, он запустит что-то вроде:

import requests            

response = requests.get(url)
html = response.text
1
Martin Evans 22 Мар 2017 в 16:32

Если вы знакомы с DOM (объектная модель документа), то вы можете использовать ответы в этом размещайте и используйте BeautifulSoup библиотеку для загрузки html в формате DOM , После этого вы можете просто найти экземпляры <tr> и на каждом из этих экземпляров найти все соответствующие <td> теги внутри. Думайте о DOM как о древовидной структуре, в которой ветвление происходит во вложенных тегах.

1
Community 23 Май 2017 в 11:46