2012-03-20 48 views
5

Tôi là người mới làm quen với lxml. Tôi muốn tải xuống trang web và nhận dữ liệu quan tâm từ, mã của tôi là:lxml bằng python, phân tích cú pháp từ url

import urllib2 
from lxml import etree 

url = "http://www.example.com/" 

html = urllib2.urlopen(url) 

root = etree.parse(html) # the problem is here 

bất cứ ai có thể giải thích cho tôi biết tại sao nó sai?

lỗi là:

Traceback (most recent call last): 
    File "yatego.py", line 10, in <module> 
    root = etree.parse(html) 
    File "lxml.etree.pyx", line 2942, in lxml.etree.parse (src/lxml/lxml.etree.c:54187) 
    File "parser.pxi", line 1550, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:79703) 
    File "parser.pxi", line 1580, in lxml.etree._parseFilelikeDocument (src/lxml/lxml.etree.c:80012) 
    File "parser.pxi", line 1463, in lxml.etree._parseDocFromFilelike (src/lxml/lxml.etree.c:78908) 
    File "parser.pxi", line 1019, in lxml.etree._BaseParser._parseDocFromFilelike (src/lxml/lxml.etree.c:75905) 
    File "parser.pxi", line 564, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:71739) 
    File "parser.pxi", line 645, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:72614) 
    File "parser.pxi", line 585, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71955) 
lxml.etree.XMLSyntaxError: Entity 'mdash' not defined, line 4, column 21 

Mã này:

url = "http://www.example.com/" 

res = requests.get(url) 
doc = lxml.html.parse(res.content) 

cho lỗi này:

File "yatego.py", line 11, in <module> 
    doc = lxml.html.parse(res.content) 
    File "/usr/lib/python2.7/dist-packages/lxml/html/__init__.py", line 692, in parse 
    return etree.parse(filename_or_url, parser, base_url=base_url, **kw) 
    File "lxml.etree.pyx", line 2942, in lxml.etree.parse (src/lxml/lxml.etree.c:54187) 
    File "parser.pxi", line 1528, in lxml.etree._parseDocument (src/lxml/lxml.etree.c:79485) 
    File "parser.pxi", line 1557, in lxml.etree._parseDocumentFromURL (src/lxml/lxml.etree.c:79768) 
    File "parser.pxi", line 1457, in lxml.etree._parseDocFromFile (src/lxml/lxml.etree.c:78843) 
    File "parser.pxi", line 997, in lxml.etree._BaseParser._parseDocFromFile (src/lxml/lxml.etree.c:75698) 
    File "parser.pxi", line 564, in lxml.etree._ParserContext._handleParseResultDoc (src/lxml/lxml.etree.c:71739) 
    File "parser.pxi", line 645, in lxml.etree._handleParseResult (src/lxml/lxml.etree.c:72614) 
    File "parser.pxi", line 583, in lxml.etree._raiseParseError (src/lxml/lxml.etree.c:71927) 
IOError: Error reading file '<!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/xhtml"> 
<head> 
    <title>IANA &mdash; Example domains</title> 

Mã này:

doc = lxml.html.parse(url) 

hoạt động tốt

Vậy vấn đề ở đâu?

+0

Sự cố là gì? Bạn đã mong đợi điều gì và bạn đã nhận được gì? – Dikei

+0

bạn nhận được thông báo lỗi nào? bạn mong đợi điều gì sẽ xảy ra? – Mizipzor

Trả lời

9

Mấu chốt ở đây là ngoại lệ:

IOError: Error reading file '<!DOCTYPE html PUBLIC ... 

Bạn đang chuyển nội dung của tệp đến một hàm mong muốn một đường dẫn đến tệp. Lý do tương tự doc = lxml.html.parse(url) hoạt động, một url "là một" filepath.

Công việc sau có tốt hơn không?

doc = lxml.html.fromstring(res.content) 
+0

Ý của bạn là sai: res = requests.get (url) doc = lxml.html.parse (res.content) – user873286

+0

có, dòng nơi bạn gán cho 'doc' là sai (trừ khi tôi sai) và nên xem như tôi đã đăng. – Mizipzor

0

Bạn nên sử dụng html.read() để bắt đầu: HTML không phải là loại chuỗi. Ngoài ra, bạn thực sự nên kiểm tra xem URL đã được tải xuống đúng chưa, vì điều này không được đảm bảo.

UPD. Sử dụng html.parse(filename_or_url)

4

Bạn nên sử dụng lxml.html để phân tích cú pháp HTML thay vì lxml.etree.

Bạn cũng có thể mở url trực tiếp với lxml:

doc = lxml.html.parse(url) 

Đôi khi lxml sẽ gặp khó khăn khi đối phó với quirks HTTP, trong trường hợp này bạn sẽ cần phải sử dụng một giải pháp mạnh mẽ hơn để nạp các trang, như requests :

res = requests.get(url) 
doc = lxml.html.parse(res.content) 
+0

Điều này sẽ hoạt động tốt hơn một chút. Không hoàn toàn chắc chắn nếu nó hoạt động với lxml.html.parse, nhưng tôi biết nó hoạt động với lxml.etree.parse. res = requests.get (url); doc = lxml.html.parse (res.'raw') –

Các vấn đề liên quan