使用 lxml 进行网页抓取时没有输出

时间:2021-05-19 12:43:24

标签: python parsing web-scraping lxml

我正在尝试从网站中提取文本

以下是部分 HTML 代码

</script>
<body onLoad="onLoad()"> 
<input id="batterystatus" value="Charging" type="hidden">
<input id="batterylevel"  value="63%" type="hidden">
<input id="signalstrength" value="Good" type="hidden">
<input id="ulCurrentDataRate" value="19317 bps" type="hidden">
<input id="dlCurrentDataRate" value="4969 bps" type="hidden">
<input id="ConnectionTime" value="00:05:40:47" type="hidden">
<input id="imsi" value="XXXXXXXXXXXX" type="hidden">
<input id="devicemodel" value="JMR540" type="hidden">
<input id="connectedStatus" value="Attached" type="hidden">
<input id="physicalCellId" value="25" type="hidden">
<input id="noOfClient" value="3" type="hidden">
<input id="eutrancellid" value="4058640090041A411" type="hidden">
<div id="divAdminApp" width="100%" align="center">  

我用来获取值的 Python 代码是

import requests
import lxml.html
html = requests.get('http://192.168.225.1')
doc = lxml.html.fromstring(html.content)
batVol = doc.xpath('/input [@id="batterylevel"]')
print('Battery Voltage: ', batVol)

我得到的输出是空白的

Output:
Battery Voltage:  []

1 个答案:

答案 0 :(得分:0)

我已经试过了,它应该可以工作

一旦您加载了 doc,我们就可以使用 get_element_by_id() 函数来获取我们需要的元素,它的 id = 'batterylevel'。这将为您提供整个元素。

doc = lxml.html.fromstring(html.content)
required_element = doc.get_element_by_id('batterylevel')
<块引用>

输出:<InputElement 2515c0c39a0 name=None type='hidden'>

我们需要的是该元素内的值。我们可以使用 .attrib 来访问元素的所有属性,它为我们提供了一个字典:

print(required_element.attrib)
<块引用>

输出:{'id': 'batterylevel', 'value': '79%', 'type': 'hidden'}

现在我们可以正常访问此字典中的 'value' 键以获取电池电量:

print(required_element.attrib['value'])
<块引用>

输出:'79%'

旁注:我看到您正在使用 lxml,这是一个非常古老的库,不支持像

这样的常见功能
  • 通过 css 类/选择器查找,
  • 一个很好的 find() 函数,它允许您搜索整个 HTML 并获取您正在寻找的任何特定文本/标签/类
  • 在页面上渲染 javascript

最后一个非常重要,因为当今大多数页面都是动态而非静态的,这意味着页面在使用 javascript 加载页面时即时生成内容,而不是将它们硬编码到 HTML 中,因为内容也是社交媒体(Instagram/facebook/等)、内容消费(youtube/netflix/等)等网站每秒都在变化

如今支持这些功能的更常用的网络抓取库是 requests_htmlBeautifulSoup,我建议您开始研究它们。