changeset 330:c8a575d35fa1 trim

take WARC-Target-URI from Request
author Henry S. Thompson <ht@inf.ed.ac.uk>
date Tue, 27 Jan 2026 17:31:27 +0000
parents d060e49285e2
children 191127a9a663
files lib/python/cc/lmh/warc2cdb.py
diffstat 1 files changed, 54 insertions(+), 49 deletions(-) [+]
line wrap: on
line diff
--- a/lib/python/cc/lmh/warc2cdb.py	Tue Jan 27 13:32:13 2026 +0000
+++ b/lib/python/cc/lmh/warc2cdb.py	Tue Jan 27 17:31:27 2026 +0000
@@ -59,60 +59,65 @@
   m: typing.Match[cython.bytes] | None
   mm: typing.Match[cython.bytes] | None
   lmi: cython.bytes
-  if part==1:
+  if wtype==warc.REQ and part==1:
     if (m:=TUPAT.search(buf)):
       URI=m[1]
     else:
       raise ValueError(b"No target URI in %s ??"%buf)
-    if (md:=DPAT.search(buf)):
-      DATE=md[1]
+  else:
+    # Response
+    if part==1:
+      # WARC headers
+      if (md:=DPAT.search(buf)):
+        DATE=md[1]
+      else:
+        raise ValueError(b"No date in %s ??"%buf)
     else:
-      raise ValueError(b"No date in %s ??"%buf)
-  else:
-    mm=LMPAT.search(buf)
-    if mm:
-      N += 1
-      dateTime=mm[1]
-      if dateTime.endswith(b'GMT'):
-        if not dateTime.endswith(b' GMT'):
-          dateTime = dateTime[:-3]+b' GMT' # FFPAT.sub(b'\\1 GMT',dateTime)
-      try:
+      # HTTP headers
+      mm=LMPAT.search(buf)
+      if mm:
+        N += 1
+        dateTime=mm[1]
+        if dateTime.endswith(b'GMT'):
+          if not dateTime.endswith(b' GMT'):
+            dateTime = dateTime[:-3]+b' GMT' # FFPAT.sub(b'\\1 GMT',dateTime)
         try:
-          lmi = b'%d'%int(email.utils.parsedate_to_datetime(dateTime.decode('utf8')).timestamp())
-        except OverflowError:
-          lmi = b'32535215999'
-      except (TypeError,IndexError,ValueError) as e:
-        print(dateTime.rstrip(),e,sep='\t',file=sys.stderr)
-        LOSE += 1
-        return
-      DATE=(DATE.translate(DTAB,DDEL))
-      (DATE,LM) = shrink_key.shrink_key(DATE,C_BASE,lmi)
-      WIN += 1
-      try:
-        URI.decode('ascii')
-      except UnicodeDecodeError:
-        UERRS += 1
-        # Try just fixing the non-ASCII:
-        URI = URI.decode('utf-8').encode('ascii', errors='java_unicode')
-      # Could just assume http, but let's check
-      if URI.startswith(b'http'):
-        URI=URI[4:]
-      else:
-        NON_HTTP += 1
-      l: int = len(LM)
-      kl: int = (len(DATE)+len(URI)+(len(SEG) if R_T else 0))
-      OUT.write(b'+')
-      OUT.write(b'%d'%kl)
-      OUT.write(b',')
-      OUT.write(b'%d'%l)
-      OUT.write(b':')
-      OUT.write(DATE)
-      if R_T:
-        OUT.write(SEG)
-      OUT.write(URI)
-      OUT.write(b'->')
-      OUT.write(LM)
-      OUT.write(b'\n')
+          try:
+            lmi = b'%d'%int(email.utils.parsedate_to_datetime(dateTime.decode('utf8')).timestamp())
+          except OverflowError:
+            lmi = b'32535215999'
+        except (TypeError,IndexError,ValueError) as e:
+          print(dateTime.rstrip(),e,sep='\t',file=sys.stderr)
+          LOSE += 1
+          return
+        DATE=(DATE.translate(DTAB,DDEL))
+        (DATE,LM) = shrink_key.shrink_key(DATE,C_BASE,lmi)
+        WIN += 1
+        try:
+          URI.decode('ascii')
+        except UnicodeDecodeError:
+          UERRS += 1
+          # Try just fixing the non-ASCII:
+          URI = URI.decode('utf-8').encode('ascii', errors='java_unicode')
+        # Could just assume http, but let's check
+        if URI.startswith(b'http'):
+          URI=URI[4:]
+        else:
+          NON_HTTP += 1
+        l: int = len(LM)
+        kl: int = (len(DATE)+len(URI)+(len(SEG) if R_T else 0))
+        OUT.write(b'+')
+        OUT.write(b'%d'%kl)
+        OUT.write(b',')
+        OUT.write(b'%d'%l)
+        OUT.write(b':')
+        OUT.write(DATE)
+        if R_T:
+          OUT.write(SEG)
+        OUT.write(URI)
+        OUT.write(b'->')
+        OUT.write(LM)
+        OUT.write(b'\n')
 
 def main(CCdate: str, segment: str, outdir: str, subdir: str, fpat: str, dp: str ):
   global OUT, N, WIN, LOSE, UERRS, SEG, R_T
@@ -131,7 +136,7 @@
       print(infile_name,file=sys.stderr)
       WIN = LOSE = N = UERRS = NON_HTTP = 0
       if subdir in ['warc','robotstxt']:
-        warc.warc(infile_name,LMHline,[warc.RESP],parts=3)
+        warc.warc(infile_name,LMHline,[warc.REQ,warc.RESP],parts=3)
       elif subdir == 'crawldiagnostics':
         warc.warc(infile_name,LMHline,[warc.RESP, warc.REVISIT],parts=3)
       else: