почему мой xpath всегда не получает ничего подобного "[]"? - PullRequest
0 голосов
/ 07 января 2019

Я новичок в сканировании веб-страницы. мой код пытается получить время на сайте. Я нашел местоположение и пытался использовать xpath для получения текста (). Но мой код всегда возвращает «[]». Я что-то пропустил?

# -*- coding: utf-8 -*-
import urllib
from bs4 import BeautifulSoup

from lxml import etree
from lxml import html
import requests
headers= { 'User-Agent' : 'User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.143 Safari/537.36' }

tree = requests.get('https://www.time.gov/',headers=headers).content#.decode('utf-8')


doc_tree = etree.HTML(tree)
links = doc_tree.xpath('//div[@id="lzTextSizeCache"]/div[@class="lzswftext"]/text()')

print links

Местоположение HTML-кода:

<div class="lzswftext" style="padding: 0px; overflow: visible; width: auto; height: auto; font-weight: bold; font-style: normal; font-family: Arial, Verdana; font-size: 50px; white-space: pre; display: none;">09:37:26 a.m. </div>

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вы не получите время, потому что в этом запросе его нет:

enter image description here

Это потому, что веб-страница делает еще один запрос на получение времени. В данном конкретном случае запрос «https://www.time.gov/actualtime.cgi?disablecache=1546870424051&lzbc=wr1d55", получает следующий HTML:

<timestamp time="1546870996756222" delay="1545324126332171"/>

Есть некоторый код javascript, который преобразует эту временную метку в дату, вы можете смоделировать ее с помощью python:

In [28]: import requests                                                                                                                                                                                            

In [29]: from datetime import datetime                                                                                                                                                                              

In [30]: res = requests.get('https://www.time.gov/actualtime.cgi?disablecache=1546870424051&__lzbc__=wr1d55')                                                                                                       
2019-01-07 09:34:15 [urllib3.connectionpool] DEBUG: Starting new HTTPS connection (1): www.time.gov:443
2019-01-07 09:34:16 [urllib3.connectionpool] DEBUG: https://www.time.gov:443 "GET /actualtime.cgi?disablecache=1546870424051&__lzbc__=wr1d55 HTTP/1.1" 200 None

In [31]: from bs4 import BeautifulSoup 
    ...:                                                                                                                                                                                                            

In [32]: soup = BeautifulSoup(res.text, 'html.parser')                                                                                                                                                              

In [34]: soup.timestamp['time']                                                                                                                                                                                     
Out[34]: '1546871656757021'

In [35]: ts = soup.timestamp['time']                                                                                                                                                                                

In [38]: ts = int(soup.timestamp['time'])                                                                                                                                                                           

In [39]: ts /= 1000000     # because timestamp is in microseconds                                                                                                                                                                                         

In [40]: print(datetime.utcfromtimestamp(ts).strftime('%Y-%m-%d %H:%M:%S')) 
    ...:                                                                                                                                                                                                            
2019-01-07 14:34:16

Чтобы узнать время в вашей локальной зоне, прочитайте: Преобразование строки даты и времени UTC в локальную дату и время с Python .

Это может быть слишком сложное решение, также вы можете просто использовать что-то вроде Selenium или scrapy + splash, которое получает то же, что вы видите в браузере.

0 голосов
/ 07 января 2019

Ваш товар генерируется асинхронно

  • Для создания страницы, которую вы ищете, требуется некоторое время. Вы можете увидеть в исходном коде страницы некоторые инструкции, такие как setTimeout("updatexearthImage()", 10000);
  • Также в исходном коде вы можете видеть, что ваш элемент не является частью для начальной страницы. При выполнении curl например

Решение

Попробуйте использовать безголовый браузер, который запускает Javascript, вам также может понадобиться включить в код некоторые задержки , чтобы страница полностью отображалась. Например Кукольник или, может быть, Селен

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