В чем причина этой ошибки «Объект NavigableString не имеет атрибута findAll»? - PullRequest
0 голосов
/ 11 марта 2020

Я не могу поделиться страницей, но это пример html кода, к которому я хочу получить доступ

<tr ng-repeat="record in records | orderBy: query.fullname" ng-click="create_dialog(record)" class="hand_cursor ng-scope" title="View Details" style="">
								<td class="ng-binding">96685</td>
								<td class="ng-binding">Alvarado, Jacqueline C.</td>
                                <td class="ng-binding">Nov 6, 2017</td>
								<td align="right" class="ng-binding">A1054</td>
                                <td align="right" class="ng-binding">A1054 - A1054</td>
                                <td align="right" class="ng-binding">87004000</td>
							</tr>
<tr ng-repeat="record in records | orderBy: query.fullname" ng-click="create_dialog(record)" class="hand_cursor ng-scope" title="View Details">
								<td class="ng-binding">33522</td>
								<td class="ng-binding">Bailey, Jacqueline B.</td>
                                <td class="ng-binding">Jan 16, 1992</td>
								<td align="right" class="ng-binding">DL-46</td>
                                <td align="right" class="ng-binding">DL-46 - DL-46</td>
                                <td align="right" class="ng-binding">81313001</td>
							</tr>

Это код, который я пытаюсь запустить. То, что я пытаюсь сделать, это получить доступ ко второму TD в первом TR, на который я нацелился. Моим ожидаемым результатом должно быть имя Текст в сторону 2-й тд

test_words = ['Jacqueline','abercrombie']
    test_word = ['STEVEN']


    # test_words = ['STEVEN','(',')','-','69807','21490','321']
    for i in test_words:
        search = self.driver.find_element_by_xpath('//*[@id="page-wrapper"]/div[3]/div/div/div/div/div[3]/tabletoolstrans/div/input')
        search.clear()
        search.send_keys(i)
        search.send_keys(Keys.RETURN)
        time.sleep(3)
        soup = BeautifulSoup(self.driver.page_source,"html.parser")
        for item in soup.findAll("tr", {"class": "hand_cursor ng-scope"})[1]:
            for td in item.findAll("td")[1]:
                if td == i:
                    print("Search :"+i+"")
                    buttons.save_csv(self, "Pass")
                else:
                    print("Fail")
        print("jaq")
    time.sleep(3)

1 Ответ

1 голос
/ 11 марта 2020

Проблема в том, что item является объектом NavigableString, который содержит значение \n. NavigableString - это просто небольшой текст на странице, в то время как вы, вероятно, ожидаете список td элементов на основе вашего кода. Чтобы узнать больше о NavigableStrings, смотрите здесь:

https://www.crummy.com/software/BeautifulSoup/bs4/doc/#navigablestring

Я думаю, что здесь проблема с обозначением массива ([0]) в конце вашего findAll's , Вы правильно получаете все tr, затем берете только одно, используя обозначение массива, и затем l oop через результат того, что является единственным объектом tr в этой точке. Результатом этого являются теги td и пробелы между ними.

Короче, избавьтесь от [0];)

Код завершения, который я считаю, должен быть ...

test_words = ['Jacqueline','abercrombie']
test_word = ['STEVEN']

for i in test_words:
    search = self.driver.find_element_by_xpath('//*[@id="page-wrapper"]/div[3]/div/div/div/div/div[3]/tabletoolstrans/div/input')
    search.clear()
    search.send_keys(i)
    search.send_keys(Keys.RETURN)
    time.sleep(3)
    soup = BeautifulSoup(self.driver.page_source,"html.parser")
    for item in soup.findAll("tr", {"class": "hand_cursor ng-scope"}):
        for td in item.findAll("td"):
            if td.text == i:
                print("Search :"+i+"")
                buttons.save_csv(self, "Pass")
            else:
                print("Fail")
    print("jaq")
time.sleep(3)

Примечание - также добавлено .text в эту строку для получения содержимого тега.

if td.text == i:
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...