Scrapy - 格式化内容和HTML属性

时间:2014-07-09 03:25:46

标签: python html5 xpath scrapy

我正在使用Scrapy进行导入,但我在内部链接格式化方面遇到了麻烦。

采用以下HTML结构:

<div class="PageContent">
    <a href="files/documents/path1.pdf">Click me</a>
    <a href="files/documents/path2.pdf">Click me</a>
    <a href="files/documents/path3.pdf">Click me</a>
</div>

XPath:

item["page_content"] = response.xpath("//div[@class='PageContent']".encode("ascii","ignore"))[0].extract().replace('\r','')

这很有效。我还检查了任何文件的响应,并下载它们。我已经自定义了FilesPipeline,以便保留其相对路径和名称,并且不会将其转换为GUID

pdf_urls = nodes.xpath(u'//a[@href[contains(., ".pdf")]]/@href'.encode("utf-8")).extract()  

这也运作良好。

如果扩展名是.PDF,我需要修改item["page_content"]并在HREF属性的前面和前面加一个字符串。我试过这个(和各种版本):

for attr in response.xpath(u'//a[@href[contains(., ".pdf")]]/@href'):
    attr[href] = "/new/dir/in/front" + attr

没有成功。此外,即使我已成功修改此数据,如何阻止items["page_content"]成为具有这些新属性的列表?我想要的结果是

items["page_content"] =     <div class="PageContent">
                                <a href="/new/dir/in/front/files/documents/path1.pdf">Click me</a>
                                <a href="/new/dir/in/front/files/documents/path2.pdf">Click me</a>
                                <a href="/new/dir/in/front/files/documents/path3.pdf">Click me</a>
                            </div>

提前致谢

2 个答案:

答案 0 :(得分:1)

好吧,我玩了一段时间,但我最终使用XML / HTML解析器来格式化我的数据。它更容易,更快,并提供更多的控制。为可能遇到类似问题的任何人发布此答案。

代码片段:

from lxml import html as HTML
from lxml import etree as ET

...

doc_pattern = ('//a[@href['
           ' contains(., ".pdf") or' 
           ' contains(., ".dot") or'
           ' contains(., ".rtf") or' 
           ' contains(., ".doc") or'
           ' contains(., ".xls") or' 
           ' contains(., ".docx") or'
           ' contains(., ".xlsx")'
           ']]')

def parse_page_html(pattern, 
                    response=response, 
                    HTML=HTML, 
                    ET=ET
                    ):

            parser  = ET.HTMLParser(remove_comments=True, remove_blank_text=True)
            content = response.xpath(pattern)[0].extract()
            content = content.encode("ascii","ignore")
            content = content.replace('\r','').replace('\n','').replace('\t','')
            body    = HTML.fromstring(content, parser=parser)

            for links in body.xpath(doc_pattern):
                links.attrib['href'] = remove_absolute_url( links.attrib['href'] )

...
content = ET.tostring(body)
return content

我之前从未做过这样的事情(并且使用了Python大约3个小时),但lxml让我进入了<45分钟。我最终重写了很多脚本以利用它,结果很棒。

答案 1 :(得分:0)

您是否尝试手动生成[&#34; page_content&#34;]项目?类似的东西:

items['page_content'] = []
for attr in response.xpath(u'//a[@href[contains(., ".pdf")]]/@href'):
    items['page_content'].append("/new/dir/in/front" + attr)