Нежелательный вывод CSV, соскобленный с веб-сайта|С использованием Python и Selenium

#python #selenium #csv

Вопрос:

У меня возникли проблемы с результатом экспорта CSV на веб-сайте, с которого я пытаюсь удалить данные.

Проблемы с выводом: Вывод в столбце, но только в первом столбце, и он выводит только первый столбец данных текст

Вывод в строках, но только в одной строке текст

Я просто хочу, чтобы он выводился типичным способом текст

Вот фрагмент html всего сайта, где моя конкретная цель:

 <tbody id="sitesList">
    <tr data-value="11230" class="item-row">
        <td class="text-left"><a href="www.example.com" target="_blank">example.com</a> <i class="fa fa-external-link"></i>
            <br><span>» <a href="www.domain.com/site/11230.html" target="_blank" class="text-danger">view site details</a></span></td>
        <td>92</td>
        <td>71</td>
        <td>Do Follow</td>
        <td style="font-size:12px;font-family:sans-serif !important;">Education
            <br>Family amp;amp; Parenting
            <br>Food amp;amp; Drink
            <br>
        </td>
        <td>Included</td>
        <td><strong>$1</strong></td>
        <td><span data-id="11230" class="btn btn-success btn-sm addtocart">Buy Website $1</span></td>
    </tr>
    <tr data-value="11229" class="item-row">
        <td class="text-left"><a href="example1.com/" target="_blank">example1.com</a> <i class="fa fa-external-link"></i>
            <br><span>» <a href="www.domain.com/site/11229.html" target="_blank" class="text-danger">view site details</a></span></td>
        <td>65</td>
        <td>34</td>
        <td>Do Follow</td>
        <td style="font-size:12px;font-family:sans-serif !important;">Business amp;amp; Finance
            <br>General: Multi-Niche
            <br>
        </td>
        <td>Included</td>
        <td><strong>$2</strong></td>
        <td><span data-id="11229" class="btn btn-success btn-sm addtocart">Buy Website $2</span></td>
    </tr>
    <tr data-value="11228" class="item-row">
        <td class="text-left"><a href="example2.com" target="_blank">example2.com</a> <i class="fa fa-external-link"></i>
            <div class="tooltip owner_tooltip" style="float: right;opacity: 1;width: 20px;height: 20px;background-size: 100%;"><span class="tooltiptext">Owner Verified</span></div>
            <br><span>» <a href="www.domain.com/site/11228.html" target="_blank" class="text-danger">view site details</a></span></td>
        <td>27</td>
        <td>26</td>
        <td>Do Follow</td>
        <td style="font-size:12px;font-family:sans-serif !important;">Cryptocurrency
            <br>
        </td>
        <td>Not Included</td>
        <td><strong>$3</strong></td>
        <td><span data-id="11228" class="btn btn-success btn-sm addtocart">Buy Website $3</span></td>
    </tr>
    <tr data-value="11227" class="item-row">
        <td class="text-left"><a href="example3.com" target="_blank">example3.com</a> <i class="fa fa-external-link"></i>
            <br><span>» <a href="www.domain.com/site/11227.html" target="_blank" class="text-danger">view site details</a></span></td>
        <td>23</td>
        <td>29</td>
        <td>Do Follow</td>
        <td style="font-size:12px;font-family:sans-serif !important;">Business amp;amp; Finance
            <br>Health
            <br>SEO amp;amp; Digital Marketing
            <br>
        </td>
        <td>Included</td>
        <td><strong>$4</strong></td>
        <td><span data-id="11227" class="btn btn-success btn-sm addtocart">Buy Website $4</span></td>
    </tr>
</tbody>
 

Я использую селен, и вот мой код:

 siteList_tds = driver.find_elements(By.XPATH, "//tbody[@id='sitesList']//tr//td")
with open('test.csv', 'w') as f:
    write = csv.writer(f)
    for s in siteList_tds:
        write.writerow(s.text) ## or write.writerow([s.text])
 

Ответ №1:

Я бы попробовал следующее:

 siteList_trs = driver.find_elements(By.XPATH, "//tbody[@id='sitesList']//tr")
with open('test.csv', 'w') as f:
    write = csv.writer(f)
    for r in siteList_trs:
        href = r.find_element_by_xpath('.//a').get_attribute('href')
        tds = r.find_elements_by_xpath('.//td')
        data = []
        for td in tds:
            data.append(td.text)
        write.writerow(data.insert(0, href))
 

Что этот код делает по-другому:

  1. найдите tr теги вместо td того, чтобы перебирать их
  2. Захватите href атрибут из a тега, который происходит от tr
  3. Захватите остальные элементы этой строки td
  4. Повторите td их, чтобы создать список, состоящий из каждого td.text
  5. Наконец, запишите data список в строку, но вставьте href строку в начале в ту же строку.

Комментарии:

1. Попробовал. Получена эта ошибка: Обратная трассировка (последний последний вызов): Файл «<ввод>», строка 10, в <ввод><модуль> _csv.Ошибка: ожидаемая повторяемость, не тип

2. Таким образом, xpath "//tbody[@id='sitesList']//tr" ничего не возвращает. Это невозможно на основе HTML, которым вы поделились. Должно быть, происходит что-то еще. Может быть, вам нужно подождать загрузки страницы? Просто невозможно, чтобы ваш xpath "//tbody[@id='sitesList']//tr//td" возвращал какие-либо элементы, но "//tbody[@id='sitesList']//tr" не делал этого при использовании в одном и том же месте кода.

3. Попробовал просто зациклить результат без сохранения в csv, я получил список, но все результаты цикла данных: Нет. Попробовал это, получил ожидаемые данные, но на выходе все еще есть повторы. Вот вывод: ! текст Вот правка, которую я сделал: with open('test.csv', 'w') as f: write = csv.writer(f) for r in siteList_trs: href = r.find_element_by_xpath('.//a').get_attribute('href') tds = r.find_elements_by_xpath('.//td') data = [] for td in tds: data.append(td.text) write.writerow(data)

4. Есть href и tds есть None ?