Здравствуйте, в настоящее время я работаю над программой, которая отправит номер телефона на веб-сайт обратного телефонного номера, а затем будет следовать правильному Xpath, чтобы определить, является ли телефон беспроводным или нет.

Xpath элемента

//*[@id="content"]/fieldset/div/table/tbody/tr[3]/td[2]/strong

Мой код до сих пор

def Phone_Checker(number):
    url = 'http://www.reversephonelookup.com/'
    data={'Enter Number': number}
    r = requests.post(url, data=data)
    tree=html.fromstring(r.content)
    Service_type=tree.xpath('//fieldset[@id="content"]/text()')
    print(Service_type)
    if "wireless" in Service_type:
        print(True)
        return True
    else: 
        print(False)
        return False

Мне просто интересно, неправильно ли я ввожу свой xpath, и если мой код должен правильно отправлять номер телефона, я посредственный программист и хотел бы знать, как я смогу заставить этот код работать так, как я хотел бы.

2
August Costa 25 Июн 2016 в 00:24

1 ответ

Лучший ответ

В вашем подходе отсутствует довольно много необходимых данных и шагов, когда я впервые посмотрел, я увидел, что на странице используется много javascript, но, отслеживая запросы, которые я видел, вы действительно можете получить их с помощью запросов, сначала нам нужно опубликовать:

http://www.reversephonelookup.com/results.php с правильными данными публикации:

enter image description here

Как только мы это сделаем, нам нужно сделать запрос на получение http://www.reversephonelookup.com/number/the_number :

enter image description here

Итак, все это вместе:

def Phone_Checker(number):
    head = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    url = 'http://www.reversephonelookup.com/results.php'
    data = {"phone": number, "image.x": "26", "image.y": "37"}
    with requests.Session() as s:
        s.post(url, data=data, headers=head)
        r = s.get("http://www.reversephonelookup.com/number/{}/".format(number),headers=head)
        tree = html.fromstring(r.content)
        Service_type = tree.xpath('//*[@id="content"]//fieldset//text()')
        return  "wireless" in Service_type


Phone_Checker("2068675309")

return Service_type and "wireless" in Service_type вернет True, только если беспроводная связь является строкой в ​​списке. Я также настроил ваш xpath, чтобы получить весь текст.

Более полезным способом использования функции было бы возвращение дерева lxml:

def Phone_Checker(number):
    head = {
    "User-Agent":"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
    url = 'http://www.reversephonelookup.com/results.php'
    data = {"phone": number, "image.x": "26", "image.y": "37"}
    with requests.Session() as s:
        s.post(url, data=data, headers=head)
        r = s.get("http://www.reversephonelookup.com/number/{}/".format(number),headers=head)
    return html.fromstring(r.content)

Затем:

xml = Phone_Checker(....)

Пример:

In [5]: xml = Phone_Checker("8598795756")


In [6]: print(xml.xpath("//fieldset//tr/td[text()='Original Service Type:']/following::strong/text()"))
['Landline', 'Independent Telephone Company', 'Versailles, KY', 'VRSLKYXADS0']

Первый результат - это тип подключения, который, если вы просто хотите, вы можете использовать:

"//fieldset//tr/td[text()='Original Service Type:']/following::strong[1]/text()"
0
Padraic Cunningham 25 Июн 2016 в 13:21
Большое спасибо за помощь! Я нашел ваш ответ очень полезным, однако, когда я использую метод, описанный во втором коде, он работает только в том случае, если у меня есть phone_checker (number), однако, когда я пытаюсь получить доступ к модулю из другого кода, чтобы перебрать список номеров телефонов, он возвращает я получаю сообщение об ошибке, что lxml не имеет модуля fromstring, но я не получаю эту ошибку, иначе вы знаете, что может быть источником этой проблемы?
 – 
August Costa
28 Июн 2016 в 21:09
@AugustCosta, вы случайно назвали свой скрипт lxml.py?
 – 
Padraic Cunningham
28 Июн 2016 в 23:37
Каннингем, нет, я не редактировал свой пост, чтобы вы лучше понимали мою новую проблему.
 – 
August Costa
29 Июн 2016 в 00:05
@AugustCosta, лучше задать новый вопрос с полной информацией, вы можете ссылаться на этот вопрос для контекста. Также лучше вставлять трассировку, чем использовать изображения.
 – 
Padraic Cunningham
29 Июн 2016 в 00:07