find_element_by_xpath в Python - PullRequest
       2

find_element_by_xpath в Python

2 голосов
/ 12 февраля 2012

Я ищу часть веб-страницы, которая выходит:

<TR class='title'><TD colspan=3 bgcolor=#C0C0C0>Order number 6097279</TD></TR>

Я хочу вытащить номер, который меняется каждый раз из текста (например: «Номер заказа 6097279» дает мнестрока '6097279')

Я пробовал следующее и получаю сообщение об ошибке «невозможно найти элемент»:

order_number = order_products.find_element_by_xpath("//TR[@class='title']");

Трассировка выглядит следующим образом:

in call_orderpage(https://www.daz3d.com/i/account/orderdetail?order=8104987)
Failed!
Error (NoSuchElementException): Message u'Unable to locate element: {"method":"xpath","selector":"//tr[@class=\'title\']"}'
Program finished!

Изменение TR на tr не имеет значения.

Почему это не работает?У меня есть другие поиски find_element_by_xpath, которые используют 'class = phrasing, и они работают.


Код, который я использую:

order_number = order_products.find_element_by_xpath("//TR[@class='title']");

Согласно тому, что я прочитал, элемент xpathимена не чувствительны к регистру.Но я получаю ту же ошибку в любом случае.

Ответ, который я получаю:

enter image description here

Что касается не "принятия" ответов, я прошу прощения за это - частьиз-за незнания, что я должен был, другая часть в том, что я не получаю уведомления, когда был ответ.

Я вернусь и внесу исправление.

====================================

Изменить, чтобы ответить на gfortune ...

Я обновил ваш вопрос информацией, которую вы указали в ответе.В будущем либо ответьте здесь в комментарии, либо отредактируйте свой вопрос напрямую и обновите его, чтобы он содержал дополнительную информацию.Редактирование вашего вопроса - лучший подход.Я отправил изменения для рецензирования, так что надеюсь, что скоро появится.К сожалению, мы все еще не нашли достаточного количества контекста для вашего вопроса.А) Какую библиотеку вы используете?Б) Больше кода.Одна строка, вероятно, не достаточно.C) Больше информации на странице, которую вы анализируете.В идеале, очень короткий контрольный пример, который вызывает ошибку.- gfortune

Честно говоря, мелкий шрифт на панели «комментарии» трудно читать.Кроме того, я не получаю уведомления о том, что был получен ответ ...

В любом случае, я не использую lxml - потому что я не понял, что это было.Теперь, когда у меня есть идея получше, я посмотрю, как это работает, спасибо.

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

И я подумал, что опубликовал исправление моего кода, который сработал - вот и снова.

order_number = order_products.find_element_by_xpath("//tr[@class='title even']");

Вы заметите «даже название» вместо класса «заголовок» ... firepath показал мне этот скрытый бит, который сбивал меня с толку и поиск xpath ...

Мой код для работы с этим стал:

    order_number = order_products.find_element_by_xpath("//tr[@class='title even']");
order_number = order_number.text
order_number = order_number.replace('Order number ', '')
print '\nOrder number [' + order_number + ']'

, который отделяет номер от «Номер заказа» ...

1 Ответ

2 голосов
/ 15 февраля 2012

Основываясь на новой информации, я собираюсь сделать несколько слепых предположений и получить ответ, который мы можем улучшить, узнав больше.

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

Во-вторых, сообщение об ошибке означает, что элемент не существует. Вы уверены, что tr с class = 'title' существует в документе, в котором вы читаете? Запустите ваш код для тестового файла, который, как вы уверены, содержит HTML, который вам нужен. Я приведу пример HTML, который работает.

Как и было обещано, ниже приведен пример использования lxml.html для анализа файла примера и извлечения номера заказа. Если есть конкретные причины, по которым это не сработает, пожалуйста, опубликуйте соответствующую информацию в комментарии, и я приведу пример для вас. Если вы просто не можете переключиться на lxml, нам потребуется больше информации в соответствии с просьбой в комментариях. Пожалуйста, отредактируйте исходный вопрос (маленькая кнопка редактирования под ним) по мере необходимости.

test.py

import lxml.html

data = lxml.html.parse('test.html')

orders = data.xpath('//tr[@class="title"]/td')

for order in orders:
    print('Order text: ' + order.text)
    print('Parsed order number: ' + order.text.split(' ')[-1])

test.html

<html>
<head><title>Test</title></head>
<body>
Blah blah
<div>Ignore me</div>
<div>Outer stuff
    <table border="1">
        <tr><td>bogus stuff we don't care about</td></tr>
        <tr class='title'><td color='grey'>Order Number 6097279</td></tr>
        <tr class='something_else'><td>Boring stuff</td></tr>
    </table>
</div>
</body>
</html>

выход

Order text: Order Number 6097279
Parsed order number: 6097279
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...