Tak więc jestem względnie nowy dla Pythona, i aby się nauczyć, rozpocząłem pisanie programu, który przechodzi do trybu online na wikipedia, znajduje pierwszy link w sekcji przeglądu losowego artykułu, podąża za tym linkiem i kontynuuje, dopóki nie wejdzie w pętlę lub nie znajdzie strony filozofii (jak szczegółowe here), a następnie powtarza ten proces dla nowego losowego artykułu określoną liczbę razy. Następnie chcę zebrać wyniki w jakiejś formie użytecznej struktury danych, tak żebym mógł przekazać dane do R za pomocą Rpy library, dzięki czemu mogę narysować jakiś schemat sieci (R jest całkiem dobry w rysowaniu takich rzeczy) z każdym węzeł na diagramie reprezentującym odwiedzane strony i strzałki, które są ścieżkami zaczerpniętymi z początkowego artykułu na stronę filozofii.Schemat filozofii Wikipedii w python i R
Nie mam problemu ze zwróceniem Pythona, by zwrócił dość rozbudowany html z wiki, ale są pewne problemy, których nie jestem w stanie zrozumieć. Do tej pory wybrałem pierwszy link za pomocą cssselector z biblioteki lxml. Wybiera dla pierwszego ogniwa (w tag), który jest bezpośrednim potomkiem tagu AP, który jest bezpośrednim potomkiem znacznika div class = „mw-content-ltr” tak:
user_agent = 'Mozilla/4.0 (compatible; MSIE 6.0; Windows NT)'
values = {'name' : 'David Kavanagh',
'location' : 'Belfast',
'language' : 'Python' }
headers = { 'User-Agent' : user_agent }
encodes = urllib.urlencode(values)
req = urllib2.Request(url, encodes, headers)
page = urllib2.urlopen(req)
root = parse(page).getroot()
return root.cssselect("div.mw-content-ltr>p>a")[0].get('href')
Ten kod znajduje się w funkcji, za pomocą której znajduję pierwszy link na stronie. Działa to w większości przypadków, ale problem polega na tym, że pierwszy link znajduje się wewnątrz jakiegoś innego znacznika, a nie jest bezpośrednim potomkiem znacznika p, na przykład powiedzmy tagu b lub czegoś, za czym tęsknię. Jak widać z powyższego artykułu wiki, odnośniki kursywą lub nawiasami nie kwalifikują się do gry, co oznacza, że nigdy nie dostaję linku kursywą (dobrze), ale często uzyskuję linki, które znajdują się w nawiasach (złe) i czasami brakuje pierwszego linku na stronie, na przykład pierwszego linku w artykule na krześle, który jest taboretem, ale jest pogrubiony, więc go nie rozumiem. Próbowałem usunąć klauzulę bezpośredniego potomka, ale często otrzymuję linki, które znajdują się "powyżej" sekcji przeglądu, które zwykle znajdują się w bocznym polu, w znaczniku p, w tabeli, w tym samym dziale, co sekcja przeglądu.
więc pierwsza część moje pytanie brzmi:
Jak mogłem używać cssselectors lub jakaś inna funkcja lub biblioteki, aby wybrać pierwszy link w głównej sekcji, która nie znajduje się wewnątrz nawiasów lub kursywą. Myślałem o używaniu wyrażeń regularnych do przejrzenia surowego html, ale wydaje mi się, że to bardzo niefrasobliwe rozwiązanie i pomyślałem, że może być coś ładniejszego, o czym nie pomyślałem.
Obecnie przechowuję wyniki na liście list. Mam więc listę zwaną ścieżkami, w której znajdują się listy zawierające ciągi zawierające tytuł artykułu wiki.
Druga część pytania to: Jak przejść przez tę listę list, aby przedstawić wiele ścieżek konwergentnych? Czy przechowywanie wyników w ten sposób jest dobrym pomysłem? Ponieważ schemat końcowy powinien wyglądać jak drzewo do góry nogami, pomyślałem o zrobieniu jakiejś klasy drzewiastej, ale to wygląda na dużo pracy dla czegoś, co jest koncepcyjnie, dość proste.
Wszelkie pomysły i sugestie będą mile widziane.
Cheers,
Davy
Proszę nie umieszczać dwóch różnych pytań w jednym! – taleinat
Piękna zupa może lepiej parsować HTML (IMO). Obiekt BS ma atrybuty (w sensie obiektowym), które zwracałyby znaczniki zagnieżdżone, a także atrybuty (w sensie znacznika HTML) znacznika. Powinien być zwinny. Dont ** nigdy ** używaj wyrażeń regularnych do parsowania HTML http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags/1732454#1732454 – aitchnyu