2010-07-07 31 views
9

Tôi vừa cài đặt python, mplayer, beautifulsoup và sipie để chạy Sirius trên máy tính Ubuntu 10.04 của tôi. Tôi theo một số tài liệu có vẻ đơn giản, nhưng tôi đang gặp phải một số vấn đề. Tôi không quen thuộc với Python, vì vậy điều này có thể nằm ngoài giải đấu của tôi.lỗi thẻ bắt đầu không đúng định dạng - Python, BeautifulSoup và Sipie - Ubuntu 10.04

tôi đã có thể để có được tất cả mọi thứ được cài đặt, nhưng sau đó chạy sipie cho này:

/usr/bin/Sipie/Sipie/Config.py:12: DeprecationWarning: the md5 module is deprecated; use hashlib instead import md5
Traceback (most recent call last): File "/usr/bin/Sipie/sipie.py", line 22, in <module> Sipie.cliPlayer()
File "/usr/bin/Sipie/Sipie/cliPlayer.py", line 74, in cliPlayer completer = Completer(sipie.getStreams())
File "/usr/bin/Sipie/Sipie/Factory.py", line 374, in getStreams streams = self.tryGetStreams()
File "/usr/bin/Sipie/Sipie/Factory.py", line 298, in tryGetStreams soup = BeautifulSoup(data)
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup-3.1.0.1-py2.6.egg/BeautifulSoup.py", line 1499, in __init__ BeautifulStoneSoup.__init__(self, *args, **kwargs)
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup-3.1.0.1-py2.6.egg/BeautifulSoup.py", line 1230, in __init__ self._feed(isHTML=isHTML)
File "/usr/local/lib/python2.6/dist-packages/BeautifulSoup-3.1.0.1-py2.6.egg/BeautifulSoup.py", line 1263, in _feed self.builder.feed(markup)
File "/usr/lib/python2.6/HTMLParser.py", line 108, in feed self.goahead(0)
File "/usr/lib/python2.6/HTMLParser.py", line 148, in goahead k = self.parse_starttag(i)
File "/usr/lib/python2.6/HTMLParser.py", line 226, in parse_starttag endpos = self.check_for_whole_start_tag(i)
File "/usr/lib/python2.6/HTMLParser.py", line 301, in check_for_whole_start_tag self.error("malformed start tag")
File "/usr/lib/python2.6/HTMLParser.py", line 115, in error raise HTMLParseError(message, self.getpos())
HTMLParser.HTMLParseError: malformed start tag, at line 100, column 3

Tôi nhìn qua những tập tin và số dòng, nhưng vì tôi không quen với Python, nó không có ý nghĩa nhiều. Bất kỳ lời khuyên nào về việc cần làm tiếp theo?

Trả lời

8

Các sự cố bạn gặp phải khá phổ biến và chúng giải quyết cụ thể với HTML được tạo dạng mal. Trong trường hợp của tôi, có một phần tử HTML có giá trị gấp đôi trích dẫn giá trị của thuộc tính. Tôi đã gặp phải vấn đề này ngày hôm nay, và vì thế làm như vậy đã đi qua bài đăng của bạn. Tôi cuối cùng đã có thể giải quyết vấn đề này thông qua phân tích cú pháp HTML thông qua html5lib trước khi trao nó ra khỏi BeautifulSoup 4.

Trước hết, bạn sẽ cần phải:

sudo easy_install bs4 
sudo apt-get install python-html5lib 

Sau đó, chạy mã ví dụ này:

from bs4 import BeautifulSoup 
import html5lib 
from html5lib import sanitizer 
from html5lib import treebuilders 
import urllib 

url = 'http://the-url-to-scrape' 
fp = urllib.urlopen(url) 

# Create an html5lib parser. Not sure if the sanitizer is required. 
parser = html5lib.HTMLParser(tree=treebuilders.getTreeBuilder("beautifulsoup"), tokenizer=sanitizer.HTMLSanitizer) 
# Load the source file's HTML into html5lib 
html5lib_object = parser.parse(file_pointer) 
# In theory we shouldn't need to convert this to a string before passing to BS. Didn't work passing directly to BS for me however. 
html_string = str(html5lib_object) 

# Load the string into BeautifulSoup for parsing. 
soup = BeautifulSoup(html_string) 

for content in soup.findAll('div'): 
    print content 

Nếu bạn có bất kỳ câu hỏi nào về mã này hoặc cần hướng dẫn cụ thể hơn một chút, hãy cho tôi biết.:)

+2

Tôi nhận được 'ValueError: treebuilder không được công nhận" beautifulsoup "' (Python 2.7.5, beautifulsoup 4.3.2, html5lib 0.999) –

-2

Nhìn vào cột 3 của dòng 100 trong "dữ liệu" được đề cập trong File "/usr/bin/Sipie/Sipie/Factory.py", dòng phiên bản 298

+0

Tôi hiểu ý bạn là gì, nhưng tôi đang gặp khó khăn khi tìm những dữ liệu này ... Vẫn đang tìm kiếm. Vẫn còn không quen thuộc cách tất cả các chương trình này làm việc cùng nhau ... Bất kỳ gợi ý bổ sung? – nicorellius

2

mới hơn của BeautifulSoup uses HTMLParser rather than SGMLParser (do SGMLParser bị xóa khỏi thư viện chuẩn Python 3.0). Kết quả là, BeautifulSoup không còn có thể xử lý nhiều tài liệu HTML không đúng định dạng nữa, đó là điều tôi tin rằng bạn đang gặp phải ở đây.

Một giải pháp cho vấn đề của bạn có khả năng là để uninstall BeautifulSoup, and install an older version (mà vẫn sẽ làm việc với Python 2.6 trên Ubuntu 10.04LTS):

sudo apt-get remove python-beautifulsoup 
sudo easy_install -U "BeautifulSoup==3.0.7a" 

Chỉ cần lưu ý rằng giải pháp tạm thời này sẽ không còn làm việc với Python 3.0 (có thể trở thành mặc định trong các phiên bản tương lai của Ubuntu).

15

Giả sử bạn đang sử dụng BeautifulSoup4, tôi phát hiện ra điều gì đó trong văn bản chính thức về vấn đề này: http://www.crummy.com/software/BeautifulSoup/bs4/doc/#installing-a-parser

If you’re using a version of Python 2 earlier than 2.7.3, or a version of Python 3 earlier than 3.2.2, it’s essential that you install lxml or html5lib–Python’s built-in HTML parser is just not very good in older versions.

tôi đã cố gắng này và nó hoạt động tốt, giống như những gì @Joshua

soup = BeautifulSoup(r.text, 'html5lib') 
+1

+1, tốt !! –

+0

Đây có phải là "r" trong mã trên một đối tượng html từ thư viện yêu cầu không? Dù thế nào đi chăng nữa, oneliner tuyệt vời này cũng hoạt động như một nét duyên dáng bằng thư viện pycurl. +1 – FredTheWebGuy

+1

@Dreadful_Code: r = requests.get (url) – dannyroa

2

Dòng lệnh:

$ pip install beautifulsoup4 
$ pip install html5lib 

Python 3:

from bs4 import BeautifulSoup 
from urllib.request import urlopen 

url = 'http://www.example.com' 
page = urlopen(url) 
soup = BeautifulSoup(page.read(), 'html5lib') 
links = soup.findAll('a') 

for link in links: 
    print(link.string, link['href']) 
+0

@ Ryan Allen Tôi cũng nhận được thông báo thẻ bắt đầu không đúng định dạng nhưng tôi cần phải phân tích cú pháp bằng tệp html được lưu vào đĩa chứ không phải url mở. Có cách nào để làm việc này không? – ShaunO

+0

Bạn chỉ cần mở tệp thay vì sử dụng urlopen. 'page = open ('your/file/path /')' –

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