Как найти значение в таблице без идентификаторов? (Python, Selenium)

#python #selenium #selenium-webdriver

#python #селен #selenium-webdriver

Вопрос:

У меня есть веб-страница с таблицей со многими строками. Пользователь даст мне число (15308), которое можно найти в верхней строке с первым <td> тегом, и это единственная информация, которая у меня будет. Я хочу иметь возможность использовать это число для поиска данных между <th></th> тегом (более конкретно 0), но только для строки таблицы. Например, я прикрепил две строки таблицы, и мне нужны <th> данные с номером 15308, но не <th> данные из строки таблицы, в первой из которых стоит номер 15309 <td> . Приветствуется любая помощь!
Желаемый результат: 0

 <tr>
<td><a href="http://sdb.admin.uw.edu/timeschd/UWNetID/sln.asp?QTRYR=SPR 2019amp;amp;SLN=15308">15308</a></td>
<td nowrap="">INFO   101  </td>
<td>A </td>
<td align="CENTER">LC</td>
<td>SOCIAL NETWORKING   </td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 250</td>
<th align="CENTER">  0</th><td align="CENTER"> 229</td>
<td></td>
</tr>
<tr><td><a href="http://sdb.admin.uw.edu/timeschd/UWNetID/sln.asp?QTRYR=SPR 2019amp;amp;SLN=15309">15309</a></td>
<td nowrap="">INFO   101  </td>
<td>AA</td>
<td align="CENTER">LB</td>
<td>SOCIAL NETWORKING   </td>
<td align="CENTER">  25</td>
<td align="CENTER">  25</td>
<td align="CENTER">  26</td>
<th align="CENTER" style="">  2</th><td align="CENTER">  21</td>
<td></td>
</tr>
  

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

1. @Fareed : Какое значение вы хотите получить и какой xpath вы пробовали?

2. @DirtyBit Я пытаюсь получить значение 0, найденное в <th> </th>

3. @FareedMabrouk посмотрите, поможет ли ответ, опубликованный ниже?

4. @FareedMabrouk Каким должен быть результат вашего последнего отредактированного вопроса?

5. @DirtyBit Я должен получать только 0

Ответ №1:

Используйте следующий код :

 userValue='15308'
all_td_th_of_row = driver.find_elements_by_xpath("//td[normalize-space()='"   userValue   "']//following-sibling::td|th")
i = 0
while i<len(all_td_th_of_row) : 
    print(all_td_th_of_row[i].text)
    i=i 1
  

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

1. На странице есть несколько <th> </th>, как я могу выбрать тот, который содержится в <tr> </tr>, который также содержит число 15308?

2. @FareedMabrouk : что такое 15308?

3. @FareedMabrouk : 15308 это то значение, которое вы хотите получить? можете ли вы дать мне точный html или ссылку на вашу страницу

4. Как я могу дать вам точный html? Если я дам вам ссылку, это не сработает, поскольку для этого требуется логин @PritamMaske

5. Я думаю, что теперь моя проблема более ясна, я отредактировал вопрос

Ответ №2:

То, что я всегда находил прекрасным, используя beauitfulsoup :

Использование xpath="1" в качестве атрибута:

 line = '''<tr><td><a href="http://sdb.admin.uw.edu/timeschd/UWNetID/sln.asp?QTRYR=SPR 2019amp;amp;SLN=15308" style="">15308</a></td>
<td nowrap="">INFO   101  </td>
<td>A </td>
<td align="CENTER">LC</td>
<td>SOCIAL NETWORKING   </td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 250</td>
<th align="CENTER" style="" xpath="1">  0</th><td align="CENTER"> 229</td>
<td></td>
</tr>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(line, 'html.parser')
xpathTh = soup.find('th',  attrs={'xpath': '1'})
print(xpathTh.text.strip())
  

ВЫВОД:

 0
  

Редактировать:

Чтобы получить все значения из атрибута:

 line = '''<tr><td><a href="http://sdb.admin.uw.edu/timeschd/UWNetID/sln.asp?QTRYR=SPR 2019amp;amp;SLN=15308" style="">15308</a></td>
<td nowrap="">INFO   101  </td>
<td>A </td>
<td align="CENTER">LC</td>
<td>SOCIAL NETWORKING   </td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 250</td>
<th align="CENTER" style="" xpath="1">  0</th><td align="CENTER"> 229</td>
<th align="CENTER" style="" xpath="1">  1</th><td align="CENTER"> 229</td>
<th align="CENTER" style="" xpath="1">  2</th><td align="CENTER"> 229</td>
<td></td>
</tr>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(line, 'html.parser')
xpathTh = soup.find_all('th',  attrs={'xpath': '1'})

for elem in xpathTh:
    print(elem.text.strip())
  

ВЫВОД:

 0
1
2
  

ПРАВКА 2:

Учитывая, что вам нужно только xpath value если anchor tag внутри td (inside tr ) имеет значение 15308 :

 line = '''<tr><td><a href="http://sdb.admin.uw.edu/timeschd/UWNetID/sln.asp?QTRYR=SPR 2019amp;amp;SLN=15308" style="">15308</a></td>
<td nowrap="">INFO   101  </td>
<td>A </td>
<td align="CENTER">LC</td>
<td>SOCIAL NETWORKING   </td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 250</td>
<th align="CENTER" style="" xpath="1">  0</th><td align="CENTER"> 229</td>
<td></td>
</tr>
<tr><td><a href="http://sdb.admin.uw.edu/timeschd/UWNetID/sln.asp?QTRYR=SPR 2019amp;amp;SLN=2222" style="">22222</a></td>
<td nowrap="">INFO   101  </td>
<td>A </td>
<td align="CENTER">LC</td>
<td>SOCIAL NETWORKING   </td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 250</td>
<th align="CENTER" style="" xpath="1">  1</th><td align="CENTER"> 229</td>
<td></td>
</tr>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(line, 'html.parser')

trElems = soup.find_all('tr')
toFind = '15308'

for tr in trElems:
    val = tr.select('td a')[0].text
    if toFind == val:
        xpathTh = tr.find_all('th', attrs={'xpath': '1'})
        for elem in xpathTh:
            print(elem.text.strip())
  

ВЫВОД:

 0
  

ПРАВКА 3:

Продолжение комментариев:

 line = '''<tr>
<td><a href="http://sdb.admin.uw.edu/timeschd/UWNetID/sln.asp?QTRYR=SPR 2019amp;amp;SLN=15308">15308</a></td>
<td nowrap="">INFO   101  </td>
<td>A </td>
<td align="CENTER">LC</td>
<td>SOCIAL NETWORKING   </td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 150</td>
<td align="CENTER"> 250</td>
<th align="CENTER">  0</th><td align="CENTER"> 229</td>
<td></td>
</tr>
<tr><td><a href="http://sdb.admin.uw.edu/timeschd/UWNetID/sln.asp?QTRYR=SPR 2019amp;amp;SLN=15309">15309</a></td>
<td nowrap="">INFO   101  </td>
<td>AA</td>
<td align="CENTER">LB</td>
<td>SOCIAL NETWORKING   </td>
<td align="CENTER">  25</td>
<td align="CENTER">  25</td>
<td align="CENTER">  26</td>
<th align="CENTER" style="">  2</th><td align="CENTER">  21</td>
<td></td>
</tr>'''

from bs4 import BeautifulSoup

soup = BeautifulSoup(line, 'html.parser')

trElems = soup.find_all('tr')
toFind = '15308'

for tr in trElems:
    val = tr.select('td a')[0].text
    if toFind == val:
        xpathTh = tr.find_all('td')[7]
        print("For the value: {}, The result is {}".format(toFind, xpathTh.find_next('th').text.strip()))
  

ВЫВОД:

 For the value: 15308, The result is 0
  

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

1. Я полагаю, что это сработало бы для таблицы с одной строкой, но страница представляет собой большую таблицу со многими строками, я нахожу номер 15308 через «find_element_by_link_text», но это все, что я могу сделать, мне было интересно, может быть, есть способ переместить определенное количество элементов, используя цикл for?

2. Извините, но я не думаю, что я четко объясняю свою проблему, я отредактирую свой пост, чтобы попытаться придать ему больше ясности

3. Я думаю, что я прояснил свою проблему в новом отредактированном вопросе, я пытаюсь получить только <th> данные из одной строки таблицы. Спасибо, что остаетесь со мной!