Проблема разбора Scrapy с искаженными тегами br - PullRequest
1 голос
/ 22 июня 2011

У меня есть 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) также должен правильно ее проанализировать.

Ответы [ 2 ]

3 голосов
/ 23 июня 2011

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, вам просто нужно написать простой (или сложный) экстрактор ссылок .

Например.

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 ...
0 голосов
/ 21 июня 2012

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

...