2012-03-05 71 views
5

Tôi vừa mới bắt đầu học cào web bằng cách sử dụng Python. Tuy nhiên, tôi đã gặp phải một số vấn đề.Web Cạo dữ liệu bằng cách sử dụng python?

Mục tiêu của tôi là để phế liệu web tên của các loài cá ngừ khác nhau từ fishbase.org (http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=salmon)

Vấn đề: Tôi không thể trích xuất tất cả các tên loài.

Đây là những gì tôi có cho đến nay:

import urllib2 
from bs4 import BeautifulSoup 

fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Tuna' 
page = urllib2.urlopen(fish_url) 

soup = BeautifulSoup(html_doc) 

spans = soup.find_all(

Từ đây, tôi không biết làm thế nào tôi sẽ đi về giải nén tên loài. Tôi đã nghĩ đến việc sử dụng regex (tức soup.find_all("a", text=re.compile("\d+\s+\d+")) để nắm bắt các văn bản bên trong thẻ ...

Bất kỳ đầu vào sẽ được đánh giá cao!

Trả lời

2

Nhìn vào trang web, tôi không chắc chắn chính xác về những thông tin bạn muốn trích xuất Tuy nhiên, lưu ý rằng bạn có thể dễ dàng nhận được các văn bản trong một thẻ bằng cách sử dụng text thuộc tính:..

>>> from bs4 import BeautifulSoup 
>>> html = '<a>some text</a>' 
>>> soup = BeautifulSoup(html) 
>>> [tag.text for tag in soup.find_all('a')] 
[u'some text'] 
0

Nếu bạn muốn có một giải pháp lâu dài, hãy thử scrapy Nó là khá đơn giản và hiện rất nhiều làm việc cho bạn. Nó rất tùy biến và có thể mở rộng Bạn sẽ trích xuất tất cả các URL bạn cần bằng cách sử dụng xpath, đó là m quặng dễ chịu và đáng tin cậy. Vẫn còn cho phép bạn sử dụng lại, nếu bạn cần.

4

Bạn cũng có thể tận dụng thực tế là tất cả các tên khoa học (và tên khoa học chỉ) đang <i/> tags:

scientific_names = [it.text for it in soup.table.find_all('i')] 

Sử dụng BS và RegEx hai cách tiếp cận khác nhau để phân tích một trang web. Cái cũ tồn tại, do đó bạn không phải bận tâm quá nhiều với cái sau.

Bạn nên đọc về những gì BS thực sự làm, có vẻ như bạn đang đánh giá thấp tiện ích của nó.

4

Những gì jozek gợi ý là cách tiếp cận chính xác, nhưng tôi không thể làm cho đoạn mã của anh ấy hoạt động (nhưng có thể vì tôi không chạy bản BeautifulSoup 4 beta). Có gì làm việc cho tôi là:

import urllib2 
from BeautifulSoup import BeautifulSoup 

fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Tuna' 
page = urllib2.urlopen(fish_url) 

soup = BeautifulSoup(page) 

scientific_names = [it.text for it in soup.table.findAll('i')] 

print scientific_names 
+2

Thật vậy 'findAll' đã được đổi tên cho 'find_all' để được tuân thủ pep8. Thông tin thêm [tại đây] (http://www.crummy.com/software/BeautifulSoup/bs4/doc/#method-names). – jcollado

1

Cảm ơn tất cả mọi người ... Tôi đã có thể giải quyết vấn đề tôi gặp phải với mã này:

import urllib2 
from bs4 import BeautifulSoup 

fish_url = 'http://www.fishbase.org/ComNames/CommonNameSearchList.php?CommonName=Salmon' 
page = urllib2.urlopen(fish_url) 
html_doc = page.read() 
soup = BeautifulSoup(html_doc) 

scientific_names = [it.text for it in soup.table.find_all('i')] 

for item in scientific_names: 
print item 
+2

Đừng quên chấp nhận câu trả lời đã giúp bạn nhiều nhất là câu trả lời đúng. – BioGeek

+0

... vì vậy sẽ phù hợp để đánh dấu Câu trả lời của Joe là câu trả lời chính xác ... điều này giúp giữ cho mọi người nhảy vào để trả lời suy nghĩ không ai làm việc đó cho bạn. – CLaFarge

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