Scrapy解析错误的br标签问题

时间:2011-06-22 16:46:26

标签: beautifulsoup lxml scrapy

我有一个html文件,网址分隔为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 个答案:

答案 0 :(得分:3)

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中使用这个方法,你只需要写一个简单的(或复杂的)link extractor

例如

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 ...

答案 1 :(得分:-1)

根据最新惯例的建议,只使用<br>代码而不是<br/>代码。