Ik ben in .NET aan het proberen om een webpagina te screen-scrapen, d.w.z. nuttige informatie uit HTML te vissen. Omdat deze HTML een beetje brak is, laat ik deze HTML door een library (HtmlAgilityPack) omzetten naar XML, en vervolgens wil ik dan middels XPath-expressies de juiste data eruit vissen.
Na de conversie ziet de XML er als volgt uit (de echte pagina is veel groter, maar dit stuk is relevant):
Nu is het mijn bedoeling om het <table>-element te vinden waar de tabeldata in staat, en die tabel is te herkennen aan het feit dat deze wordt voorafgegaan door "<< prev" en "next >>" (in de volledige XML zijn er veel meer <table>-elementen).
Mijn eerste doel is nu om middels XPath het <p>-element te vinden met de "<< prev" en "next >>" tekst. Wat me wel lukt is om de <b>-elementen te vinden met deze teksten erin; dit doe ik met de volgende XPath-expressie:
Deze expressies geven netjes de betreffende <b>-elementen terug. Maar ik krijg het niet voor elkaar om het <p>-element te vinden dat deze <b>-elementen bevat. Mijn eerste gedachte was
maar deze geeft alle <p>-elementen terug, niet per se degenen die ergens "<< Prev" bevatten (in het hele document zijn ook meerdere <p>-elementen).
Wie kan mij vertellen wat ik hier verkeerd doe, en hoe het wel zou moeten?
Na de conversie ziet de XML er als volgt uit (de echte pagina is veel groter, maar dit stuk is relevant):
XML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| <html> <body> <i>--Knip--</i> <p align="center"> <b><<&nbsp;Prev</b> &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <a href="overzicht.php?page=1"> <b>Next&nbsp;>></b> </a> <br /> <i>--Knip--</i> </p> <i>--Knip--</i> <table style="border-width:1px;"> <tr> <td><i>Tabeldata</i></td> </tr> </table> </body> </html> |
Nu is het mijn bedoeling om het <table>-element te vinden waar de tabeldata in staat, en die tabel is te herkennen aan het feit dat deze wordt voorafgegaan door "<< prev" en "next >>" (in de volledige XML zijn er veel meer <table>-elementen).
Mijn eerste doel is nu om middels XPath het <p>-element te vinden met de "<< prev" en "next >>" tekst. Wat me wel lukt is om de <b>-elementen te vinden met deze teksten erin; dit doe ik met de volgende XPath-expressie:
code:
1
2
3
| //*[text()="<< Prev"] en //*[text()="Next >>"] |
Deze expressies geven netjes de betreffende <b>-elementen terug. Maar ik krijg het niet voor elkaar om het <p>-element te vinden dat deze <b>-elementen bevat. Mijn eerste gedachte was
code:
1
| //p[//*[text()="<< Prev"]] |
maar deze geeft alle <p>-elementen terug, niet per se degenen die ergens "<< Prev" bevatten (in het hele document zijn ook meerdere <p>-elementen).
Wie kan mij vertellen wat ik hier verkeerd doe, en hoe het wel zou moeten?