Trả lời

10

Dường như bạn thực sự muốn có thể phân tích cú pháp đánh dấu MediaWiki. Có một thư viện python được thiết kế cho mục đích này được gọi là mwlib. Bạn có thể sử dụng các gói XML tích hợp của python để trích xuất nội dung trang từ phản hồi của API, sau đó chuyển nội dung đó vào trình phân tích cú pháp của mwlib để tạo ra một biểu diễn đối tượng mà bạn có thể duyệt và phân tích trong mã để trích xuất thông tin bạn muốn. mwlib được cấp phép BSD.

+1

thx để được trợ giúp. Tôi đã thử hướng dẫn mwlib trong liên kết mà bạn đã cung cấp cho tôi Tuy nhiên tôi không chắc chắn làm cách nào để thao tác với đối tượng Bài viết được trả về bởi simpleparse. Ví dụ: làm cách nào để tôi xây dựng lại tất cả dữ liệu thành định dạng xml với tiêu đề phù hợp? – tomwu

+0

Bất kỳ công cụ thực tế nào hiện đang hoạt động? –

+0

@quantCode Tôi đã không trung thực xem xét trạng thái của những công cụ này trong những năm gần đây, nhưng kiểm tra nhanh về [repo Github của dự án] (https://github.com/pediapress/mwlib) cho thấy rằng mwlib vẫn thường xuyên, nếu không thường xuyên, cập nhật. Nó có lẽ vẫn còn giá trị một cái nhìn nếu bạn đang lập kế hoạch làm một cái gì đó trong không gian này. – chaos95

0

Có một số thông tin về Python và XML thư viện here.

Nếu bạn đang yêu cầu có một thư viện hiện có được thiết kế để phân tích cú pháp XML (pedia) XML cụ thể và phù hợp với yêu cầu của bạn, điều này là đáng ngờ. Tuy nhiên, bạn có thể sử dụng một trong các thư viện hiện có để duyệt DOM và rút ra dữ liệu bạn cần.

Tùy chọn khác là viết biểu định kiểu XSLT tương tự và gọi nó bằng cách sử dụng lxml. Điều này cũng cho phép bạn thực hiện các cuộc gọi đến các hàm Python từ bên trong XSLT để bạn có được tốt nhất của cả hai thế giới.

+0

Sheesh, tại sao downvote. Nếu câu trả lời của bạn tốt hơn, hãy để nó tự đứng vững - tôi không bị sai lầm. – imoatama

-5

Tôi sẽ nói xem xét sử dụng Beautiful Soup và chỉ tải trang Wikipedia bằng HTML thay vì sử dụng API.

Tôi sẽ thử và đăng ví dụ.

+0

Tôi biết đây là một câu hỏi cũ, nhưng đối với bất cứ ai tình cờ gặp điều này, hoàn toàn không ** KHÔNG ** làm điều này. Toàn bộ lý do Wikipedia cung cấp một API để họ có thể * hiệu quả * trả lại dữ liệu thô mà người dùng cần. Cào gây ra căng thẳng hoàn toàn không cần thiết trên máy chủ bằng cách gọi các công cụ hiển thị và bằng cách trả về * tất cả * nội dung bài viết. API bỏ qua hiển thị và có thể được sử dụng để chỉ kéo tập hợp con dữ liệu mà người dùng thực sự cần (ví dụ: chỉ một phần duy nhất). Cạo luôn luôn nên được sử dụng như một phương sách cuối cùng (tức là, nếu một trang web không cung cấp API). – Geoff

+0

Và ngay cả khi HTML sẽ tiết lộ cấu trúc cơ bản một cách hoàn hảo, bạn vẫn sẽ phải hiểu khái niệm về mẫu, trang định hướng, chuyển hướng, v.v. Tốt hơn để xử lý nguồn ở nơi đồng bằng với đánh dấu hợp lý dựa trên ngữ nghĩa. – tripleee

5

Chỉ cần stumbled trên một thư viện trên PyPi, wikidump, mà tuyên bố để cung cấp

Công cụ để thao tác và trích xuất dữ liệu từ wikipedia bãi

tôi không sử dụng nó, vì vậy bạn một mình để thử nó ...

3

Tôi đã mô tả cách thực hiện việc này bằng cách kết hợp pywikibot và mwparserfromhell trong this post (không có đủ danh tiếng để gắn cờ là trùng lặp).

In [1]: import mwparserfromhell 

In [2]: import pywikibot 

In [3]: enwp = pywikibot.Site('en','wikipedia') 

In [4]: page = pywikibot.Page(enwp, 'Waking Life')    

In [5]: wikitext = page.get()    

In [6]: wikicode = mwparserfromhell.parse(wikitext) 

In [7]: templates = wikicode.filter_templates() 

In [8]: templates? 
Type:  list 
String Form:[u'{{Use mdy dates|date=September 2012}}', u"{{Infobox film\n| name   = Waking Life\n| im <...> critic film|waking-life|Waking Life}}', u'{{Richard Linklater}}', u'{{DEFAULTSORT:Waking Life}}'] 
Length:  31 
Docstring: 
list() -> new empty list 
list(iterable) -> new list initialized from iterable's items 

In [10]: templates[:2] 
Out[10]: 
[u'{{Use mdy dates|date=September 2012}}', 
u"{{Infobox film\n| name   = Waking Life\n| image   = Waking-Life-Poster.jpg\n| image_size  = 220px\n| alt   =\n| caption  = Theatrical release poster\n| director  = [[Richard Linklater]]\n| producer  = [[Tommy Pallotta]]<br />[[Jonah Smith]]<br />Anne Walker-McBay<br />Palmer West\n| writer   = Richard Linklater\n| starring  = [[Wiley Wiggins]]\n| music   = Glover Gill\n| cinematography = Richard Linklater<br />[[Tommy Pallotta]]\n| editing  = Sandra Adair\n| studio   = [[Thousand Words]]\n| distributor = [[Fox Searchlight Pictures]]\n| released  = {{Film date|2001|01|23|[[Sundance Film Festival|Sundance]]|2001|10|19|United States}}\n| runtime  = 101 minutes<!--Theatrical runtime: 100:40--><ref>{{cite web |title=''WAKING LIFE'' (15) |url=http://www.bbfc.co.uk/releases/waking-life-2002-3|work=[[British Board of Film Classification]]|date=September 19, 2001|accessdate=May 6, 2013}}</ref>\n| country  = United States\n| language  = English\n| budget   =\n| gross   = $3,176,880<ref>{{cite web|title=''Waking Life'' (2001)|work=[[Box Office Mojo]] |url=http://www.boxofficemojo.com/movies/?id=wakinglife.htm|accessdate=March 20, 2010}}</ref>\n}}"] 

In [11]: infobox_film = templates[1] 

In [12]: for param in infobox_film.params: 
      print param.name, param.value 

name    Waking Life 

image   Waking-Life-Poster.jpg 

image_size  220px 

alt    

caption   Theatrical release poster 

director   [[Richard Linklater]] 

producer   [[Tommy Pallotta]]<br />[[Jonah Smith]]<br />Anne Walker-McBay<br />Palmer West 

writer   Richard Linklater 

starring   [[Wiley Wiggins]] 

music   Glover Gill 

cinematography Richard Linklater<br />[[Tommy Pallotta]] 

editing   Sandra Adair 

studio   [[Thousand Words]] 

distributor  [[Fox Searchlight Pictures]] 

released   {{Film date|2001|01|23|[[Sundance Film Festival|Sundance]]|2001|10|19|United States}} 

runtime   101 minutes<!--Theatrical runtime: 100:40--><ref>{{cite web |title=''WAKING LIFE'' (15) |url=http://www.bbfc.co.uk/releases/waking-life-2002-3|work=[[British Board of Film Classification]]|date=September 19, 2001|accessdate=May 6, 2013}}</ref> 

country   United States 

language   English 

budget   

gross   $3,176,880<ref>{{cite web|title=''Waking Life'' (2001)|work=[[Box Office Mojo]] |url=http://www.boxofficemojo.com/movies/?id=wakinglife.htm|accessdate=March 20, 2010}}</ref> 

Đừng quên rằng thông số đó cũng là các đối tượng mwparserfromhell!

1

Tôi biết câu hỏi cũ, nhưng tôi đã tìm kiếm một thư viện phân tích cú pháp wikipedia xml dump. Tuy nhiên, các thư viện được đề xuất, wikidump và mwlib, không cung cấp nhiều tài liệu mã. Sau đó, tôi tìm thấy Mediwiki-utilities, trong đó có một số tài liệu mã trong: http://pythonhosted.org/mediawiki-utilities/.

+0

Dự án thú vị nhưng chỉ hoạt động với python 3 – GrantD71

0

WikiExtractor dường như là một cách sạch sẽ, đơn giản và hiệu quả để thực hiện điều này bằng Python hôm nay: https://github.com/attardi/wikiextractor

Nó cung cấp một cách dễ dàng để phân tích một Wikipedia đổ thành một cấu trúc tập tin đơn giản như vậy:

<doc>...</doc> 
<doc>...</doc> 
... 
<doc>...</doc> 

... nơi từng tài liệu trông giống như:

<doc id="2" url="http://it.wikipedia.org/wiki/Harmonium"> 
Harmonium. 
L'harmonium è uno strumento musicale azionato con una tastiera, detta manuale. 
Sono stati costruiti anche alcuni harmonium con due manuali. 
... 
</doc> 
Các vấn đề liên quan