scrapy 如何在一个类之间刮出各种< p>量< div>

mrwjdhj3  于 2022-11-09  发布在  其他
关注(0)|答案(2)|浏览(114)

我试图刮一个网页,其中有一个未知数量的< p>标签,在一个已知的div类之间。有些网页只有1< p>个标签,而其他人有10个甚至更多。我怎么能提取他们所有?最好在一个变量内,所以我可以把他们存储在一个csv内像所有其他数据的我刮:)
HTML结构如下例所示:

<div class="div_name">
    <h2 class="h5">title text</h2>
    <p>&nbsp;</p>
    <p>text text text...</p>
    <p>text text text...</p>
    <p>&nbsp;</p>
    <p><br>text text text...</p>
    <p>&nbsp;</p>
    <p><br>text text text...</p>
    <p>&nbsp;</p>
    <p><br>text text text...</p>
    <p>&nbsp;</p>
    <p><br>text text text...</p>
    <p>&nbsp;</p>
    <p>text text text...</p>
    <p>&nbsp;</p>
    <p><br>text text text...</p>
    <p>&nbsp;</p>
    <p><br>text text text...</p>
    <p>&nbsp;</p>
    <p><br>text text text...</p>
    <p>text text text...</p>
    <p>text text text...</p>
</div>

我使用python和scrapy框架来实现这一点。
目前我有:

divs = response.xpath('/html/body/div[6]/div/section[2]/article/div/div/div')
for p in divs.xpath('.//p'):  # extracts all <p> inside
        print(p.get())
story = p

yield {
    'story': story
    }

它会打印各种标记的所有文本值< p>,但在存储到csv文件时,只有最后一个< p>值会插入到 *. csv文件中。
为了将抓取的数据存储到 *.csv中,我在我的www.example.com中有以下内容settings.py:


# Deph of Crawler

DEPTH_LIMIT = 0 # 0 = Infinite depth

# Feed Export Settings

FEED_FORMAT="csv"
FEED_URI="output_%(name)s.csv"

和上面的 yield 部分是进入 *. csv的字段。
顺致问候!

ymdaylpp

ymdaylpp1#

你可以用一句话来表达,真的:

story = ' '.join([x.get().strip() for x in response.xpath('//div[6]/div/section[2]/article/div/div/div//p')])

如果你能确认这个页面的URL,我可能会改进这个又长又脆弱的XPATH。
可在https://docs.scrapy.org/en/latest/中找到Scrapy文档

mm9b1k5b

mm9b1k5b2#

您必须存储所有p标签的文本,然后使用空格或换行符或任何您想要的方式将它们连接起来,然后将其赋值给story变量。

divs = response.xpath('/html/body/div[6]/div/section[2]/article/div/div/div')
arr = [] # this will store the text of all p tags 
for p in divs.xpath('.//p'):  # extracts all <p> inside
        print(p.get())
        arr.append(p.get()) 
story = '\n'.join(arr)

yield {
    'story': story
    }

相关问题