Python-请求,lmxl和xpath无法正常运行

时间:2019-12-25 09:04:49

标签: python-3.x xpath python-requests

我正在尝试编写一些python来刮擦网上的固件/驱动程序更新,但是不同的网页响应方式有所不同。

我已经使用请求和lxml包来基于xpath查找信息。通过在chrome中打开URL,右键单击数据并检查它,然后在显示代码时再次右键单击并选择复制xpath来找到Xpath。

工作示例
英特尔NUC位于https://downloadcenter.intel.com/product/76977/Intel-NUC-Kit-D54250WYK
在2019-12-25,它正确获取的数据值为“ 24.3”。

import requests
from lxml import html 
url="https://downloadcenter.intel.com/product/76977/Intel-NUC-Kit-D54250WYK"
page = requests.get(url)
XpathToFWtype = '//*[@id="search-results"]/tbody/tr[1]/td[4]/text()'
tree.xpath(XpathToFWtype)

失败示例
对于ASUS网站,类似的逻辑失败,它应该在固件文本 1.1.2.3_790 版本中显示:
https://www.asus.com/lk/Networking/DSL-AC56U/HelpDesk_BIOS/

失败的xpath从inspect语句返回为:

//*[@id="Manual-Download"]/div[2]/div[2]/div/div/section/div[1]/div[1]span[1]

无论我添加“ / text()”还是任何变体,我尝试的所有操作均失败。网页的不同之处在于“查看源代码”显示的是英特尔url的文本,而不是Asus的文本,因此它是在某处动态生成的-但是我不确定经过几天尝试下一步该怎么做。

import requests
from lxml import html
url="https://www.asus.com/lk/Networking/DSL-AC56U/HelpDesk_BIOS/"
page = requests.get(url)
XpathToFWtype = '//*[@id="Manual-Download"]/div[2]/div[2]/div/div/section/div[1]/div[1]/span[1]/text()'
tree.xpath(XpathToFWtype)
#  etc -> many traceback errors from lxml :-(

感谢您的任何建议或指导,非常感谢

1 个答案:

答案 0 :(得分:1)

对于INTEL网站,您可以执行以下操作:

import requests
from bs4 import BeautifulSoup

r = requests.get(
    "https://downloadcenter.intel.com/product/76977/Intel-NUC-Kit-D54250WYK")
soup = BeautifulSoup(r.text, 'html.parser')

for item in soup.findAll("td", {'class': 'dc-version collapsible-col collapsible1'}):
    item = item.text
    print(item[0:item.find("L")])

输出:

24.3
0054
1.0.0
6.1.9
15.40.41.5058
1.01
1
6.0.1.7982
11.0.6.1194
15.36.28.4332
15.40.13.4331
15.36.26.4294
14.5.0.1081
2.4.2013.711
10.1.1.8
10.0.27
2.4.2013.711
2.4.2013.711

对于ASUS网站,它实际上是使用JavaScript来呈现其内容。因此您将需要使用SeleniumPhantomJS。但是我已经能够将XHR定位到JSON API并通过请求调用它了:)。

import requests

r = requests.get(
    "https://www.asus.com/support/api/product.asmx/GetPDBIOS?website=lk&pdhashedid=RtHWWdjImSzhdG92&model=DSL-AC56U&cpu=").json()

for item in r['Result']['Obj']:
    for data in item['Files']:
        print(data['Version'])

输出:

1.1.2.3_790
1.1.2.3_743
1.1.2.3_674
1.1.2.3_617
1.1.2.3_552
1.1.2.3_502
1.1.2.3_473
  

您可以从这里解析任何内容:) https://www.asus.com/support/api/product.asmx/GetPDBIOS?website=lk&pdhashedid=RtHWWdjImSzhdG92&model=DSL-AC56U&cpu=

相关问题