【问题标题】:Parsing HTML page containing & using Python解析包含和使用 Python 的 HTML 页面
【发布时间】:2014-07-05 15:16:48
【问题描述】:

我正在尝试使用 urllib2 和 ElementTree 在 python 中解析 HTML 页面,但在解析 HTML 时遇到了问题。网页在带引号的字符串中包含“&”,但 ElementTree 为包含 & 的行抛出 parseError

脚本:

import urllib2

url = 'http://eciresults.nic.in/ConstituencywiseU011.htm'
req = urllib2.Request(url, headers={'Content-type': 'text/xml'})
r = urllib2.urlopen(req).read()

import xml.etree.ElementTree as ET
htmlpage=ET.fromstring(r)

这会在 Python 2.7 中引发以下错误

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File     "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1282, in XML
  File     "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1624, in feed
  File     "/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/xml/etree/ElementTree.py", line 1488, in _raiseerror
xml.etree.ElementTree.ParseError: not well-formed (invalid token): line 676, column 73

错误对应以下行

<input type="hidden" id="HdnFldAndamanNicobar" value="1,Andaman & Nicobar Islands;" />

读取 HTML 页面时的样子,变量 r 中的 & 符号未解析为 &amp;amp;

我尝试使用 R 程序使用 htmlTreeParse 进行解析,“&”被正确转换为 &amp;amp;

如果我在 urllib2 中遗漏任何内容,请告诉我

编辑:我将“&”替换为&amp;amp;,但第 904 行在 javascript 中包含

LINE:904    for (i = 0; i < strac.length - 1; i++) {

【问题讨论】:

    标签: python-2.7 urllib2 elementtree


    【解决方案1】:

    首先,xml.etree.ElementTree 是一个 XML 解析器。它不处理开箱即用的 HTML 实体。 &amp;an illegal thing to have inside the XML,这就是它失败的原因。

    使用真正专业的HTML 解析器BeautifulSoup

    >>> from urllib2 import urlopen
    >>> from bs4 import BeautifulSoup
    >>> url = 'http://eciresults.nic.in/ConstituencywiseU011.htm'
    >>> soup = BeautifulSoup(urlopen(url))
    >>> soup.find('td').text.strip()
    u'ELECTION COMMISSION OF INDIA'
    

    另见:

    【讨论】:

    • 谢谢。是否可以在 urllib2 请求中指定任何选项以便进行这些转换
    • @Manuel 我认为urllib2 中没有类似的东西。 urllib2 负责获取页面。处理 HTML 实体是解析器的工作。
    猜你喜欢
    • 2013-04-25
    • 2013-07-01
    • 2017-03-19
    • 2023-03-10
    • 2020-06-10
    • 1970-01-01
    • 2023-04-01
    • 2012-09-27
    • 2010-12-03
    相关资源
    最近更新 更多