Проблема парсинга Scrapy с неправильными тегами br

У меня есть html-файл с URL-адресами, разделенными тегами br, например.

<a href="example.com/page1.html">Site1</a><br/>
<a href="example.com/page2.html">Site2</a><br/>
<a href="example.com/page3.html">Site3</a><br/>

Обратите внимание, что тег разрыва строки — <br/> вместо <br />. Scrapy может анализировать и извлекать первый URL-адрес, но не может извлечь что-либо после этого. Если перед косой чертой поставить пробел, то все работает. HTML-код искажен, но я видел эту ошибку на нескольких сайтах, и, поскольку браузер может отображать ее правильно, я надеюсь, что scrapy (или базовый lxml/libxml2/beautifulsoup) также правильно ее проанализирует.


person user    schedule 22.06.2011    source источник


Ответы (2)


lxml.html анализирует его нормально. Просто используйте его вместо встроенного HtmlXPathSelector.

import lxml.html as lxml

bad_html = """<a href="example.com/page1.html">Site1</a><br/>
<a href="example.com/page2.html">Site2</a><br/>
<a href="example.com/page3.html">Site3</a><br/>"""

tree = lxml.fromstring(bad_html)

for link in tree.iterfind('a'):
    print link.attrib['href']

Результаты:

example.com/page1.html
example.com/page2.html
example.com/page3.html

Поэтому, если вы хотите использовать этот метод в CrawlSpider, вам просто нужно написать простой (или сложный) извлечение ссылок.

Eg.

import lxml.html as lxml

class SimpleLinkExtractor:
    extract_links(self, response):
        tree = lxml.fromstring(response.body)
        links = tree.xpath('a/@href')
        return links

А затем используйте это в своем пауке..

class MySpider(CrawlSpider):
    name = 'example.com'
    allowed_domains = ['example.com']
    start_urls = ['http://www.example.com']

    rules = (
        Rule(SimpleLinkExtractor(), callback='parse_item'),
    )

    # etc ...
person Acorn    schedule 23.06.2011
comment
+1 за подробный пример. Да, вы правы, но это также должно быть исправлено в базе кода scrapy. - person user; 23.06.2011

Просто используйте теги <br> вместо тегов <br/>, как это предлагается последними соглашениями.

person abhinay bagaria    schedule 21.06.2012