Selenium返回的页面源代码中所有标签名前都有"a0:"前缀

1 投票
2 回答
2015 浏览
提问于 2025-04-20 19:03

我用以下代码来下载一个网页:

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')

这是我正在抓取的链接,可能在接下来的几个小时内就会失效:

http://www.flightstats.com/go/FlightStatus/flightStatusByAirport.do?airportCode=LAX&airportQueryType=0

2 个回答

1

这其实跟编码没什么关系。这个行为是和浏览器有关的。

作为一个解决办法,可以换用 ChromeDriverPhantomJS 对我也有效):

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。

撰写回答