使用Selenium从JavaScript网页中提取文本

3
我正在尝试从此网站中提取文本“ This station managed by the Delta Flow Projects Office ”:https://waterdata.usgs.gov/ca/nwis/uv?site_no=381504121404001。此行位于stationContainer类下面。由于这是一个动态网页,我正在使用Selenium来获取HTML。

这是网站上的HTML。

img

这是我的代码:

from selenium import webdriver
from selenium.webdriver.common.by import By

browser = webdriver.Chrome()
url = "https://waterdata.usgs.gov/ca/nwis/uv?site_no=381504121404001"
browser.get(url) #navigate to the page
innerHTML = browser.execute_script("return document.body.innerHTML")
elem = browser.find_elements_by_xpath("//div[@class='stationContainer']")

print (elem)

我从我的打印消息中得到了这个结果:

selenium.webdriver.remote.webelement.WebElement (session="96fc124c0e2d1fd4cd86f61db272d52a", element="0.5862443940581294-1")

我希望通过搜索div类来获取文本,但似乎我并没有正确的方法。


你可以获取网页源代码,然后使用像bs4或lxml这样的解析库。 - whackamadoodle3000
@whackamadoodle3000,当我获取页面源代码时,它无法识别此行文本,因为它是从JS渲染的。 - saoirse
使用Selenium的get页面源代码并等待,以便JavaScript可以呈现它。 - whackamadoodle3000
请查看以下内容:https://dev59.com/eJvga4cB1Zd3GeqP35Tf - whackamadoodle3000
3个回答

1
"elem 是一个列表而不是一个 字符串。尝试这样做:"
elem = browser.find_elements_by_xpath("//div[@class='stationContainer']")[0]
print elem.text

那会打印出所有的内容。因此,你可能需要更好的选择器或一种解析其余内容的方法。

1

print (elem.text)

elem 是一个 WebElement 对象,因此打印出了这个信息。如果你想要访问文本内容,你需要在末尾加上 .text,或者如果你想获取其他属性,可以使用 elem.get_attribute('innerHTML')

另外,由于 div 元素有很多其他的文本,你会得到比你想要的更多的文本。我没有研究过其他类似的页面,但也许你可以提取 div 的 html 中 </form><br><br> 之间的内容。


0

好的,你想要爬取的内容实际上并不是动态的。你可以使用 bs4 来获取 div class stationContainer 内容。让这件事变得有点具有挑战性的是,你搜索的元素不是在某些标记之间。因此,解决方案就是进行简单的字符串操作,提取 </form><br/><br/> 标记之间的内容,就像这样:

from bs4 import BeautifulSoup
from requests import get

soup = BeautifulSoup(get('https://your_url_here').text, "html.parser")

for i in soup.find_all('div', attrs={'class':"stationContainer"}):
    print str(i).split('</form>')[1].split('<br/><br/>')[0].strip()

这段代码会产生正确的结果!


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接