Selenium返回的页面源代码中所有标签名前都有"a0:"前缀
我用以下代码来下载一个网页:
driver = webdriver.Firefox()
driver.get('https://www.SOMEWEBSITE.com')
html = driver.page_source
但是有时候我会看到像 <a0:td>一些文本</a0:td>
这样的东西,这意味着它在正常的标签名称前加了 a0:
。虽然我可以用 html.replace('a0:', '')
来去掉这些,但我还是想找到一种方法,能够直接获取没有这些多余的 a0:
的源代码。
我试过两种方法,但都没有成功。
方法一:
import sys
reload(sys); # change the system default encoding = utf-8
eval('sys.setdefaultencoding("utf-8")')
方法二:
html = driver.page_source.encode('utf-8')
这是我正在抓取的链接,可能在接下来的几个小时内就会失效:
2 个回答
1
这其实跟编码没什么关系。这个行为是和浏览器有关的。
作为一个解决办法,可以换用 ChromeDriver
(PhantomJS
对我也有效):
from selenium import webdriver
url = "http://www.flightstats.com/go/FlightStatus/flightStatusByAirport.do?airportCode=LAX&airportQueryType=0"
driver = webdriver.Chrome() # or webdriver.PhantomJS()
driver.get(url)
print driver.page_source
driver.close()
打印结果是:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/html" xml:lang="en" lang="en">
<head>
<title>
(LAX) Los Angeles International Airport Departures
</title>
...
你看,标签名前面没有 a0
这个命名空间前缀。
3
你遇到的问题其实不是编码问题。在你看到的源代码开头,有这么一段:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<a0:html xmlns:a0="http://www.w3.org/1999/xhtml" [...]
这里的 xmlns:a0="http://www.w3.org/1999/xhtml"
是在声明一个叫 a0
的命名空间。出于某种原因,当你用 Firefox 浏览器时,driver.page_source
返回的内容会使用 XML 命名空间。正如 alecxe 提到的,这种情况在不同的浏览器中表现得并不一致。
需要注意的是,driver.page_source
并不是唯一的问题。为了在不同浏览器中获得更一致的页面源代码,我发现有一种方法是让浏览器把它的 DOM 树序列化:
print driver.execute_script("return document.documentElement.outerHTML;").encode("utf-8")
这样做不需要你切换到其他浏览器,依然可以使用 Firefox。