2010-01-13 22 views
17

Tôi cố gắng để phân tích thông tin (bảng html) từ trang web này: http://www.511virginia.org/RoadConditions.aspx?j=All&r=1BeautifulSoup HTML bảng phân tích cú pháp

Hiện nay tôi đang sử dụng BeautifulSoup và mã tôi có vẻ như thế này

from mechanize import Browser 
from BeautifulSoup import BeautifulSoup 

mech = Browser() 

url = "http://www.511virginia.org/RoadConditions.aspx?j=All&r=1" 
page = mech.open(url) 

html = page.read() 
soup = BeautifulSoup(html) 

table = soup.find("table") 

rows = table.findAll('tr')[3] 

cols = rows.findAll('td') 

roadtype = cols[0].string 
start = cols.[1].string 
end = cols[2].string 
condition = cols[3].string 
reason = cols[4].string 
update = cols[5].string 

entry = (roadtype, start, end, condition, reason, update) 

print entry 

Vấn đề là với các cột bắt đầu và kết thúc. Họ chỉ được in là "Không"

Output:

(u'Rt. 613N (Giles County)', None, None, u'Moderate', u'snow or ice', u'01/13/2010 10:50 AM') 

Tôi biết rằng họ nhận được lưu trong danh sách cột, nhưng có vẻ như thẻ liên kết phụ là rối tung lên phân tích với html gốc tìm kiếm như thế này:

<td headers="road-type" class="ConditionsCellText">Rt. 613N (Giles County)</td> 
<td headers="start" class="ConditionsCellText"><a href="conditions.aspx?lat=37.43036753&long=-80.51118005#viewmap">Big Stony Ck Rd; Rt. 635E/W (Giles County)</a></td> 
<td headers="end" class="ConditionsCellText"><a href="conditions.aspx?lat=37.43036753&long=-80.51118005#viewmap">Cabin Ln; Rocky Mount Rd; Rt. 721E/W (Giles County)</a></td> 
<td headers="condition" class="ConditionsCellText">Moderate</td> 
<td headers="reason" class="ConditionsCellText">snow or ice</td> 
<td headers="update" class="ConditionsCellText">01/13/2010 10:50 AM</td> 

vì vậy những gì sẽ được in là:

(u'Rt. 613N (Giles County)', u'Big Stony Ck Rd; Rt. 635E/W (Giles County)', u'Cabin Ln; Rocky Mount Rd; Rt. 721E/W (Giles County)', u'Moderate', u'snow or ice', u'01/13/2010 10:50 AM') 

Bất kỳ suggesti trợ giúp hoặc giúp đỡ được đánh giá cao, và cảm ơn bạn trước.

+0

Cảm ơn bạn rất nhiều –

+0

Bạn không phải sử dụng Súp đẹp cho điều đó. Bạn có thể sử dụng python3 htmlparser: https://github.com/schmijos/html-table-parser-python3/blob/master/html_table_parser/parser.py – schmijos

Trả lời

32
start = cols[1].find('a').string 

hoặc đơn giản hơn

start = cols[1].a.string 

hoặc tốt hơn

start = str(cols[1].find(text=True)) 

entry = [str(x) for x in cols.findAll(text=True)] 
+0

Tôi đã đi với phương pháp str (cols ...). Cảm ơn bạn. –

+21

Chào mừng) Nó sẽ là tốt nếu bạn chấp nhận một câu trả lời nếu bạn thấy nó hữu ích –

+1

Tôi đồng ý, @Stephon Tanner xin trả lại và chấp nhận điều này như là một câu trả lời – Neil

2

Tôi đã cố gắng để tái tạo lỗi của bạn, nhưng trang nguồn html đã thay đổi.

Về lỗi này, tôi đã có một vấn đề tương tự, cố gắng để tái tạo ví dụ được here

thay đổi URL đề xuất cho a Wikipedia Table

tôi cố định nó chuyển sang BeautifulSoup4

from bs4 import BeautifulSoup 

và thay đổi số .string cho .get_text()

start = cols[1].get_text() 

Tôi không thể thử nghiệm với ví dụ của bạn (như tôi đã nói trước đây, tôi không thể tạo lại lỗi) nhưng tôi nghĩ nó có thể hữu ích cho mọi người đang tìm kiếm giải pháp cho vấn đề này.