robotstxt_obey load_item images example default_request_headers data python web-scraping scrapy

python - load_item - Scrapy: restrict_css con HTML mal formateado



scrapy robotstxt_obey (1)

El código HTML que trato de rastrear está mal formateado:

<html> <head>...</head> <body> My items here... My items here... My items here... Pagination here... </body> </head> </html>

El problema es el segundo </head> . Debo reemplazar el HTML en mi araña para usar las expresiones xpath:

class FooSpider(CrawlSpider): name = ''foo'' allowed_domains = [''foo.bar''] start_urls = [''http://foo.bar/index.php?page=1''] rules = (Rule(SgmlLinkExtractor(allow=(''/?page=/d'',),), callback="parse_start_url", follow=True),) def parse_start_url(self, response): # Remove the second </head> here # Perform my item

Ahora quiero usar el argumento restrict_xpath en mi regla, pero no puedo porque el HTML está mal formateado: el reemplazo no se ha realizado en este momento.

¿Tienes una idea, por favor?


Lo que haría sería escribir un middleware de Downloader y usar, por ejemplo, el paquete BeautifulSoup para corregir y embellecer el HTML contenido en response.body - response.replace() podría ser útil en este caso.

Tenga en cuenta que, si opta por BeautifulSoup , elija un analizador con cuidado; cada analizador tiene su propio camino en el código HTML roto; algunos son menos o más indulgentes. lxml.html sería el mejor en términos de velocidad.

Ejemplo:

from bs4 import BeautifulSoup class MyMiddleware(object): def process_response(self, request, response, spider): soup = BeautifulSoup(response.body, "lxml") response = response.replace(body=soup.prettify()) return response

Como ejemplo, de un middleware personalizado que modifica el HTML descargado, vea el middleware scrapy-splash .