2016-06-24 47 views
5

Wpadłem na nieco skomplikowany problem XPath. Rozważmy następujący kod HTML części strony internetowej (użyłem Imgur i zastępuje tekst):XPath wybierz łącza graficzne - macierzysty link href z img src tylko jeśli istnieje, w przeciwnym razie wybierz img src link

<a href="//i.imgur.com/ahreflink.jpg" class="zoom"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

raz pierwszy chcesz wyszukać wszystkie img znaczniki w dokumencie i znalezieniem odpowiadającego src es. Następnie chcę sprawdzić, czy link img src zawiera rozszerzenie pliku obrazu (.jpeg, .jpg, .gif, .png). Jeśli nie zawiera rozszerzenia obrazu, nie chwytaj go. W tym przypadku ma rozszerzenie obrazu. Teraz chcemy dowiedzieć się, który link chcemy pobrać. Ponieważ istnieje parent href, powinniśmy pobrać odpowiednie łącze.

pożądany rezultat: //i.imgur.com/ahreflink.jpg

Ale teraz powiedzmy parent href nie istnieje:

<a name="missing! oh no!"> 
    <img class="post-image-placeholder" src="//i.imgur.com/imgsrclink.jpg"> 
    </img> 
</a> 

pożądany rezultat: //i.imgur.com/imgsrclink.jpg

Jak mogę iść o budowie tego XPath? Jeśli to pomaga, używam również Python (Scrapy) z XPath. Jeśli więc problem wymaga oddzielenia, można również użyć Pythona.

+0

Czy próbowałeś już czegokolwiek? –

+0

Dotarłem tylko do części, w której sprawdzam rozszerzenia graficzne linków, ale nie wiem, jak wybrać link do pobrania. – dtgee

+0

Czy chcesz spróbować osiągnąć wynik całkowicie przy użyciu XPath, czy też używasz języka skryptowego, z którego możesz wdrożyć część logiki? –

Odpowiedz

4

Jest to bardzo proste do zrobienia w jednym wyrażeniu XPath:

//a[not(@href)]/img/@src | //a[img]/@href 
+0

Wow, nigdy nie myślałem o nadaniu pierwszeństwa img src jako pierwszemu (z brakiem), ponieważ logicznie mówiąc, pierwszeństwo daje nam href. Wygląda jak obiecujące rozwiązanie, chociaż najpierw musiałbym je przetestować. – dtgee

+0

@dtgee Nie ma priorytetu, tylko filtry. – o11c

4

Nie musisz tego robić w pojedynczym wyrażeniu XPath. Oto Scrapy specyficzny realizacja pomijając sprawdzanie wewnętrzny obraz (sądząc po komentarzach, już zorientowali, że obecnie):

images = response.xpath("//a/img") 
for image in images: 
    a_link = image.xpath("../@href").extract_first() 
    image_link = image.xpath("@src").extract_first() 

    print(a_link or image_link) 
+0

Ah, dziękuję. Sądzę, że utknąłem w transie myśląc, że muszę używać XPath tylko do selekcji wszystkiego. Nauczę się z tego błędu! – dtgee

+0

@dtgee Prawdopodobnie * robisz * chcesz to zrobić na xpath, aby utrzymać ciężkie podnoszenie w C zamiast w Pythonie. – o11c

+0

Prawda. Korzystanie z Pythona sprawia, że ​​kod staje się bardziej czytelny, ale myślę, że użycie XPath i dodanie niektórych komentarzy służy temu samemu celowi. – dtgee