使用 lxml 进行网页抓取时无输出
No output when web scraping using 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: []
我已经试过了,应该可以的
加载 doc
后,我们可以使用 get_element_by_id()
函数获取我们需要的元素,其 id = 'batterylevel'。这将为您提供整个元素。
doc = lxml.html.fromstring(html.content)
required_element = doc.get_element_by_id('batterylevel')
output:<InputElement 2515c0c39a0 name=None type='hidden'>
我们需要的是那个元素里面的值。我们可以使用 .attrib
来访问元素的所有属性,这给了我们一个字典:
print(required_element.attrib)
output: {'id': 'batterylevel', 'value': '79%', 'type': 'hidden'}
现在我们可以正常访问此字典中的 'value'
键来获取电池电量:
print(required_element.attrib['value'])
output: '79%'
旁注:我看到您正在使用 lxml
,这是一个相当古老的库,不支持
等常见功能
- css classes/selectors,
发现
- 一个很好的
find()
功能,它允许您搜索整个 HTML 并获得您正在寻找的任何特定 text/tag/class
- 在页面上呈现 javascript
最后一个非常重要,因为当今大多数页面都是动态的而不是静态的,这意味着页面的内容是在使用 javascript 加载页面时即时生成的,而不是将它们硬编码到 HTML,因为社交媒体(Instagram/facebook/etc.)、内容消费(youtube/netflix/etc.)
等网站上的内容也在每秒都在变化
目前支持这些功能的更常用的网络抓取库是 requests_html
、BeautifulSoup
,我建议您开始研究它们。
我正在尝试从网站中提取文本
下面是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: []
我已经试过了,应该可以的
加载 doc
后,我们可以使用 get_element_by_id()
函数获取我们需要的元素,其 id = 'batterylevel'。这将为您提供整个元素。
doc = lxml.html.fromstring(html.content)
required_element = doc.get_element_by_id('batterylevel')
output:
<InputElement 2515c0c39a0 name=None type='hidden'>
我们需要的是那个元素里面的值。我们可以使用 .attrib
来访问元素的所有属性,这给了我们一个字典:
print(required_element.attrib)
output:
{'id': 'batterylevel', 'value': '79%', 'type': 'hidden'}
现在我们可以正常访问此字典中的 'value'
键来获取电池电量:
print(required_element.attrib['value'])
output:
'79%'
旁注:我看到您正在使用 lxml
,这是一个相当古老的库,不支持
- css classes/selectors, 发现
- 一个很好的
find()
功能,它允许您搜索整个 HTML 并获得您正在寻找的任何特定 text/tag/class - 在页面上呈现 javascript
最后一个非常重要,因为当今大多数页面都是动态的而不是静态的,这意味着页面的内容是在使用 javascript 加载页面时即时生成的,而不是将它们硬编码到 HTML,因为社交媒体(Instagram/facebook/etc.)、内容消费(youtube/netflix/etc.)
等网站上的内容也在每秒都在变化目前支持这些功能的更常用的网络抓取库是 requests_html
、BeautifulSoup
,我建议您开始研究它们。