webForumDet fria alternativet

reg exp vilket jag inte förstår?

ASP

16 svar · 1 512 visningar · startad av evilaid

Medlem sedan apr. 2009433 inlägg
Frågan#1

ok, jag måste vara dum för jag kan inte få till reg exp..

om jag har följande:
<tr valign="top">
<th>Originaltitel:</th>
<td>Just Kids</td>
</tr>

och nu vill plocka ut namnet (just kids) hur ska det går till?

hittade en svensk guide över vad alla tecken har för funktion men förstår ändå inte hur jag ska matcha dom för att få ut namnet?

Medlem sedan juni 20019 519 inlägg
#2

<td>([^<]+)</td>

om det är det ända html som skickas ut som du beskriver.

Medlem sedan apr. 2009433 inlägg
#3

O tack..

Nja det är igentligen mer text som skickas, typ:

 <tr valign="top">
 <th>&Ouml;vers&auml;ttare</th>
 <td>Ulla Danielsson</td>
 </tr>

 <tr valign="top">
 <th>Originaltitel:</th>
 <td>Just Kids</td>
 </tr>

 <tr valign="top">
 <th>F&ouml;rlag</th>
 <td><a href="/pub45095.html">Brombergs</a></td>
 </tr>

Jag frågade lite lugnt först, klarade nog inte mer än så för jag blir inte riktigt klok på ditt exempel... Jag provade det i ett litet program från gskinner.com men då maskeras ju hela raden. alltså <td>Just Kids</td>

Kör jag ditt yttryck på ovan html så får jag med två rader men inte den tredje (som är en länk) antar attd et har med hakarna att göra?

Men uttrycket då: <td>([^<]+)</td>
"<td>" gör att jag får med första taggen
() är en grupp av innehållet innanför..
[] är de också för att gruppera?
[^<]+ säger det att det ska börja < ?
([^<]+) känns som dubbla grupperingar?

Tror inte riktigt jag fattat hur man ska tänka med reg exp?

Mvh

Medlem sedan juni 20019 519 inlägg
#4

hämtar allt som är runt <td>...</td> som INTE är ett <
() => Grupp du kan hämta ut ($1)
[] => träffar vilket tecken som helst som är inne i []
[^] => Träffar vilket tecken som helst men INTE som är inne i []

i ditt exempel så får du två träffar:

 <td>Ulla Danielsson</td>
..
 <td>Just Kids</td>

men inte

 <td><a href="/pub45095.html">Brombergs</a></td>

eftersom den inte matchar då uttrycket säger att vilket tecken som helst som inte är > och direkt efter det </td>> vilket inte stämmer på den raden.

Medlem sedan feb. 20041 816 inlägg
#5

Är det screen scraping du håller på med? :) I så fall är det mycket enklare att använda XPath. Jag håller själv på med ett projekt som läser ut info från webbsidor och använder inte regex utan XPath.

Man måste tänka på att strukturen på Html-sidorna kan ändras när som helst och då vill man nog slippa sitta och harva med kryptiska regexps. XPath-uttryck är mycket lättare att läsa och även om de kan vara bökiga att få till ibland är det ingenting jämfört med hur ens regex skulle se ut.

För att kunna ställa frågor mot en Html-sida behöver man tillgång till DOM-trädet men hur det ser ut i gammal, hemsk ASP vet jag inte. Det borde gå med en komponent (COM+) men jag känner inte till någon; inte så konstigt med tanke på att jag knappt rört ASP de senaste åren. Använder man Java eller .NET finns det betydligt fler alternativ, t.ex. TagSoup, JTidy resp. HtmlAgilityPack. I .NET finns det även en sorts portning av Sizzle, en viktig del av jQuery, som gör att man kan söka i dokumentet med CSS-selektorer m.m. Tråkigt nog fick jag det inte att rulla så jag fick nöja mig med XPath istället.

Jämför regex:et med ett slarvigt, otestat och troligen icke-fungerande XPath:

document = GetWebPage(sökväg);
document.SelectSingleNode("//tr[th/text()='Originaltitel:']/td/text()");

Som sagt, uttrrcket är inte testat och eftersom jag ingte är nån guru på något vis så funkar den nog inte rakt uppochned. Men visst ser det enklare ut!

Regexp är sjukt användbart i vissa lägen men inte här.

Medlem sedan apr. 2009433 inlägg
#6

hämtar allt som är runt <td>...</td> som INTE är ett <

Men när jag provar i gskinner's program så markeras ju även td taggarna?

Jag måste vara dum på riktigt för det går inte in i mitt huvud hur jag ska tänka.
Alltså om man ska beskriva <td>([^<]+)</td> i en enda lång mening så:
välja allt som börjar med <td> och sen alla tecken förutom "<" och tecknen får förekomma 1 eller oändlig antal gånger??

Säg att jag ska plocka ut namnet på översättaren bara då, alltså Ulla Danielsson:

 <tr valign="top">
 <th>&Ouml;vers&auml;ttare</th>
 <td>Ulla Danielsson</td>
 </tr>

Kan man få med det som villkor att denna raden <td>Ulla Danielsson</td> där det föregås av <th>Översättare</th>?

dAeK:
Tyvärr är det gammal hemsk asp jag använder :bire Har inte hunnit provat sp mcyket med asp.net. Du har helt rätt, det är screen scraping jag försöker mig på..
Tror ju inte sidan kommer förändras så mycket i detta fallet och skulle det vara så får man väll korrigera för det..
Men intressant förslag.. Kan va något att tänka på i framtiden..

Medlem sedan juni 20019 519 inlägg
#7

Ja, självklart markeras hela uttrycket, men du har grupperat vad du vill hämta ut med ().
Eftersom jag måste vara extremt trög på att förklara saker så ge jag dig vad regexp säger:

[^>]+
 Match any character that is NOT a &#8220;>&#8221; «[^>]+»
    Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»

Och för din andra fråga: Ja om Det är en konstant som heter Översäattare följt av en td.

Medlem sedan apr. 2009433 inlägg
#8

Tror trögheten ligger hos mig, har tittat på det lite tidigare men nästan gett upp.. Men jag ska ge det ett nytt försök:)
Hur fick du fram texten "vad regexp säger" något program som beskriver det så eller egenkomponerat?

andra frågan där: Om du vill? hur skulle uttrycket se ut om jag vill få fram namnet på översättaren. Det är en konstant.

Tänkte att jag kunde köra två regexp. En för att ta fram översättaren (Översäattare) och en för att ta fram titeln...

Medlem sedan juni 20019 519 inlägg
#9

http://www.regular-expressions.info/ -> bra sajt för Regexp
http://www.regexbuddy.com/ -> Applikation jag tycker är värd varje krona det kostade ;)

Annars kan jag rekommendera webeye.nu (dock är den nere) men har fått lov att köra lite referenser från Vide (på wF): http://voigt.se/sandbox/regexp/#referense

om det är:

<th>&Ouml;vers&auml;ttare</th><td>([^<]+)</td>

eller:

<th>&Ouml;vers&auml;ttare</th>\n<td>([^<]+)</td>

eller

<th>&Ouml;vers&auml;ttare</th>[\n\s]+<td>([^<]+)</td>

är svårt att säga då jag inte vet exakta text strukturen du få tillbaka av datan.

Medlem sedan apr. 2009433 inlägg
#10

Sista exmplet var klockrent!! Gällde väll att få radbyte och matning rätt där:)

Exemplet fungerar kanon i asp men när jag provar med jacascript så vill det sig inte..
får bara felet
Fel: invalid regular expression flag <
Källkodsfil: http://127.0.0.1/studlit/incl/jscripts.js
Rad: 37

  
strHTML = "<th>jhhjljlj</th> <td>testar</td> för att se om regular expressions"       
var strHTML = xmlhttp.responseText;
var exp = new RegExp("<th>F&ouml;rfattare</th>[\n\s]+<td>([^<]+)</td>");
Rad 37: var expr = new RegExp(strHTML,"<th>F&ouml;rfattare</th>[\n\s]+<td>([^<]+)</td>");

blir inte klok på det??

Medlem sedan apr. 2009433 inlägg
#11

med risk för att vara otroligt jobbig:
Men:

det svar jag får från uttrycket. Skriver jag ut det på en sida så får jag ju bara titeln. Kanon! Men om jag fyller i ett formulär med det jag får tillbaka så är ju td och th taggarna med.. Hur kommer det sig?
Nu gjorde jag så att jag körde några "replace" för att få bort dom men var bara nyfiken på varför jag får med dom då?

Medlem sedan juni 20019 519 inlägg
#12

Ge mer kod! hämtar du ut hela matchningen eller tar du ut $1 bara?

Medlem sedan apr. 2009433 inlägg
#13

Hmm, $1?

Så här ser koden ut:

Set objRegExp = New regexp
objRegExp.Global = false
objRegExp.IgnoreCase = true
objRegExp.Pattern = "<th>Originaltitel:</th>[\n\s]+<td>([^<]+)</td>"
Set hittade = objRegExp.Execute(strHTML)
titel = Replace(hittade.item(0),"Originaltitel:","")
titel = Replace(titel,"<th></th> <td>","")
Set objRegExp = Nothing

nu är mina "smidiga" replace satser med ocksp :)

gjorde även ett försök att få ut författarnamnet om det är en a tagg innan som i detta:

 <tr valign="top">
 <th>F&ouml;rfattare</th>
 <td><h2 class="bookauthors"><a href="/boktips/author.html?thisauthor=Smith%2C%20Patti"><b>Patti Smith</b></a></h2></td>

Men där blir det stopp igen.
jag skulle ju vilja ha så här och en negation (eller vad det heter) som säger att jag vill ha det som inte står inom < > ? eller är det feltänk?

Medlem sedan juni 20019 519 inlägg
#14
...	objRegExp.Pattern = "<th>Originaltitel:</th>[\n\s]+<td>([^<]+)</td>"
	Set MyMatch = objRegExp.Execute(strHTML)

	If MyMatch.count > 0 Then
		titel =  MyMatch(0).SubMatches(0)
	End If

Sen kan du inte bara köra mitt uttryck rakt upp och ner, du kommer med olika saker gång på gång, regexp uttrycket säger att den bara hämtar text som är runt en <td></td> där det inte finns någon html kod.

Och ja, självklart kan du hämta ut allt som finns i <td>..</td> även html och sen ersätta all html med inget, men frågan är ens om du få göra detta för Bokia.

Medlem sedan apr. 2009433 inlägg
#15

Ok, är väll med på att jag inte kan använda ditt rakt av, men lever och lär av det:)

Gällande bokia så är detta bara för privat bruk så det lär nog inte orsaka någon större belastning för dom, kan väll se det som att jag bara tittar på deras utbud precis som vilket besökare som helst §e

Men som i exemplet då det finns en a tag innanför td taggarna..
Borde jag inte kunna använda samma som tidigare fast med villkoret att jag inte vill ha något som finns inom <>. Alltså all text inom td taggarna som inte börjar med < och slutar med >?

<th>Författare</th>[\n\s]<td>([^<]+[^>]+)

Medlem sedan juni 20019 519 inlägg
#16
<th>F&ouml;rfattare</th>[\n\s]+<td>.+<b>([^<]+)</b>.+</td>

Sen är det ju inte för att det är en belastning för dom jag är orolig över utan det är att du ta innehåll som inte är din egen.

Medlem sedan apr. 2009433 inlägg
#17

Förstår dig...

Jag sökte på lite olika isbn databaser för se om man kan hitta andra som är öppna. Hitta t.ex libris.. Blir till att börja om på uttrycken :o

Men det sista fungerade kanon.. Nu ska du slippa mer frågor från mig idag :)

Jättetack för all hjälp..

Btw: laddar ner regexbuddy nu...

259 ms totalt · 4 externa anrop · v20260731065814-full.1dc6f849
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)
126 ms — ändringar (db)