#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))
Что этот код делает по-другому:
- найдите
tr
теги вместоtd
того, чтобы перебирать их - Захватите
href
атрибут изa
тега, который происходит отtr
- Захватите остальные элементы этой строки
td
- Повторите
td
их, чтобы создать список, состоящий из каждогоtd.text
- Наконец, запишите
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
?