【问题标题】:Python - requests, lmxl and xpath not workingPython - 请求、lmxl 和 xpath 不起作用
【发布时间】:2019-12-25 09:04:49
【问题描述】:

我正在尝试编写一些 python 来抓取网络以获取固件/驱动程序更新,但不同的网页响应不同。

我已经使用 requests 和 lxml 包来查找基于 xpath 的信息。 Xpath 是通过在 chrome 中打开 URL,右键单击数据并检查它,然后在显示代码并选择复制 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)

失败的例子
华硕网站的类似逻辑失败,它应该将固件文本 Version 1.1.2.3_790:
https://www.asus.com/lk/Networking/DSL-AC56U/HelpDesk_BIOS/

失败的 xpath 从检查语句返回:

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

无论我添加“/text()”还是任何变体,我尝试的一切都失败了。这些网页的不同之处在于“查看源代码”显示的是英特尔 url 的文本,而不是华硕的文本,因此它是在某处动态生成的 - 但经过几天的尝试,我不确定接下来要做什么。

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 :-(

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

【问题讨论】:

  • 您似乎不知道ASUS 网站是通过JavaScript 加载的,而requests 模块将无法呈现它,您是否要检索下载大小?跨度>

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


【解决方案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=

【讨论】:

  • 太棒了,您可以从中解析所有内容!非常感谢。解释您是如何获得 XHR 查询的是否过于复杂?
  • @far 欢迎您,很高兴为您提供帮助。您可以通过浏览器developer-tools 和检查network-tab 获取XHR 请求。如果您需要屏幕截图,请告诉我。
  • 非常感谢您的耐心和帮助@ahmed!我找到了network-tab,然后找到了您确定的XHR 行。但是打开该 URL 时出现错误 SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data,直到我从 URL 中删除了最后一个参数以使其与您相同 => 从 URL 中删除了最终文本 &callback=supportpdpage。你知道去掉那部分只是经验吗?
  • @far 几乎欢迎,那叫JSONP call back 这是非常古老的技术,使用for sending JSON data without worrying about cross-domain issues.
  • @ahmed 非常感谢您的帮助和指导以了解更多信息,非常感谢
猜你喜欢
  • 2013-06-26
  • 2016-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-08-22
  • 2022-01-15
  • 1970-01-01
相关资源
最近更新 更多