Обойти / пропустить строки таблицы, содержащие ячейку без текста, используя селен и xpath - PullRequest
0 голосов
/ 09 июня 2019

Я уверен, что на этот вопрос есть простой ответ, но после нескольких часов исследований и испытаний я так и не решил проблему.

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

# I'm obtaining the <td> tags in the table
# with this.
td = row.find_elements_by_xpath(".//td")

# I slice out the desired items this way
# This outputs a <class 'str'>
td[3].text

# I found that this item has no text in some 
# table rows, which causes issues. I have tried 
# using the following to catch and bypass these
# rows

if not td[3].text:
   pass
else:
  # run some code
  # harvest the entire row


if len(td[3].text) != 0:
  # run some code
  # harvest the entire row
else:
  pass 


if len(td[3].text) == 11:
  # run some code
  # harvest the entire row
else:
  pass 


if td[3].text) != '':
  # run some code
  # harvest the entire row
else:
  pass 

# this element is the one that might be empty
td_time = row.find_element_by_xpath(".//td[4]/span/time")
if (len(td_time.text)) != 11:
   print ('no')
elif (len(td_time.text)) == 11:
   print ('yes')

Таблица, которую я очищаю, имеет пять столбцов.Последний столбец содержит даты, которые отсутствуют в некоторых строках, содержащих более старые данные.

# Example with date
<td headers="th-date th-4206951" class="td-date">
   <b class="cell-label ng-binding">Publish Date</b>
   <span class="cell-content"><time datetime="2019-06-05T00:00:00Z" class="ng-binding">04 Jun 2019</time></span>
</td>

# Example without date
<td headers="th-date th-2037023" class="td-date">
  <b class="cell-label ng-binding">Publish Date</b>
  <span class="cell-content"><time datetime="" class="ng-binding"></time></span>
</td>

Ни один из этих примеров кода не улавливает пустые текстовые блоки, что вызывает проблемы при последующей обработке собранных данных.

Поэтому мой вопрос: как мне обойти элемент, полученный с использованиемXPATH, у которого нет текста?

1 Ответ

1 голос
/ 10 июня 2019

Я бы просто проверил наличие элемента ниже.

rows = driver.find_elements_by_xpath("//table[starts-with(@id,'mytable')]/tbody/tr[not(td[string-length(normalize-space(text()))=0])]")
for r in rows:
    columns = r.find_elements_by_tag_name('td')
    for col in columns:
        print (col.text)

Пример HTML:

<html><head></head><body><table border="1" id="mytable">
	<tbody><tr>
		<td>1</td>
		<td></td>
		<td>FR</td>
	</tr>
	<tr>
		<td>2</td>
		<td>SR</td>
		<td></td>
	</tr>
	<tr>
		<td></td>
		<td></td>
		<td>TR</td>
	</tr>
	<tr>
		<td>4</td>
		<td> </td>
		<td>Checking cell with only space</td>
	</tr>
	<tr>
		<td>5</td>
		<td>All</td>
		<td>Rows</td>
	</tr>
</tbody></table>
</body></html>

Вот JQuery для получения всех строк, в которых нет пустых ячеек.

var list_of_cells =[];
$x("//table[starts-with(@id,'mytable')]/tbody/tr[not(td[string-length(normalize-space(text()))=0])]").forEach(function(row){
 var colData= [];
 row.childNodes.forEach(function(col){
 if(col.nodeType!=3){
    colData.push(col.textContent.trim())}
 })
list_of_cells.push(colData);
} );
console.log(list_of_cells);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...