剥离html并没有按预期工作

时间:2017-05-22 19:24:51

标签: python-3.x

试图剥离网站只给我想要的内容,而不是其他所有内容。

  <li tabindex="0">
    Facebook.

  </li>
  <li tabindex="0">
    Twitter.

  </li>
  <li tabindex="0">
    Pinterest.

  </li>
  <li tabindex="0">
    Instagram.

  </li>
  <li tabindex="0">
    Enter to Win.

  </li>

这是我试图剥离的部分内容。基本上是一个商店广告,我剥离了我不想要的东西,并留下了商店广告中剩余的东西。

我发生了一些非常奇怪的事情。我已经解决了其中几个问题,但我仍然无法摆脱&#39; \ n&#39;无论我尝试做什么,都可以。

a = re.findall('<li tabindex(.*?)</li>', html, re.DOTALL)
for x in range(0, len(a)):
    a[x] = a[x].replace('="0">', '')
    a[x] = a[x].replace('Enter to Win.', 'REMOVE')
    a[x] = a[x].replace('Pinterest.\n    \n', 'REMOVE')
    a[x] = a[x].replace('Twitter.\n    \n', 'REMOVE')
    a[x] = a[x].replace('Instagram.\n    \n', 'REMOVE')
    a[x] = a[x].replace('Facebook.\n    \n', 'REMOVE')

如果我已经完整下载了网页,那么你会注意到我必须完成“反馈”标签。以相当奇怪的方式,或者像往常一样将它们分开分开。当我打印(a)时,它会完全变空。只是一个快速幻想的方式,我想出了如何分开单独的条目。

现在我正试图删除&#39; \ n&#39;无论我尝试什么,我都无法将它们移除。

a[x] = a[x].replace('\n', '') # doesn't work
a[x] = a[x].replace('\n\n', '') # doesn't work
a[x] = a[x].replace('\r\n', '') # doesn't work
a[x] = a[x].replace('%s\n', '') # doesn't work
a[x] = a[x].replace('%s\r\n', '') # doesn't work
a[x] = a[x].rstrip('\r\n') # doesn't work
a[x] = a[x].strip('\r\n') #doesn't work

我已经尝试了到目前为止我在网上看到的所有内容尝试,没有任何东西让我删除\ n。我可以删除&#39; &#39; \ n \ n \ n \ n之间但是我无法删除\ n \ n \ n \ n

我需要做什么才能删除&#39; \ n&#39;也许同样重要的是,为什么我会遇到麻烦做标准线分离&#39; li tabindex&#39;?有些东西让我觉得答案可能是同一个原因。我以前从来没有遇到过这样的问题。

更新,原始代码我已经开始:

import os
import re
from urllib.request import urlopen
from urllib.error import HTTPError
import urllib.request 

plot = 'https://circulars.save-a-lot.com/flyers/accessibility/savealot?locale=en-US&store_code=24607&type=2'
htm = urlopen(plot).read()
html = str(htm)

a = re.findall("<li tabindex(.*?)</li>", html, re.DOTALL)
for x in range(0, len(a)):
    a[x] = a[x].replace('="0">', '')
    a[x] = a[x].replace('  ', '')

    b = ''
    for c in range(2,int(len(a[x])-2)):
        if a[x][c] == '\n':
            continue
        else:
            b = b + a[x][c]
    a[x] = b
    a[x] = a[x].replace('Flipp.', 'REMOVE')
    a[x] = a[x].replace('Instagram.', 'REMOVE')
    a[x] = a[x].replace('Facebook.', 'REMOVE')
    #etc removing what I don't want to keep
    if a[x] == 'REMOVE':
        continue
    else:
        #write file to disk

2 个答案:

答案 0 :(得分:0)

import bs4, requests
sales_list = []
sales_list_stripped = []
url = 'https://circulars.save-a-lot.com/flyers/accessibility/savealot? \
locale=en-US&store_code=24607&type=2'#make sure to either put a '\' here 
                                     #to split the url between two lines 
                                     #or put it all on one line

html = requests.get(url)
html_soup = bs4.BeautifulSoup(html.text, 'lxml')
filtered_html = html_soup.select('li')

for x in filtered_html:  #pulls text from within 'li' tags
    sales_list.append(x.getText())

for x in sales_list:   #removes \n character
    sales_list_stripped.append(x.replace('\n', ''))

print(sales_list_stripped[:8]) #test code

此代码为我提供了一个列表,其输出如下['Weekly Ad','Other 70 items','Banquet Pot Pies。 $ 0.69 ea。 7盎司,什锦品种','Save-A-Lot®苏打12包。 2 / $ 5.00。 12盎司罐装,什锦品种,','J.Higgs Snacks。 3.99美元ea。 16克拉,经典或风味混合','Mondo水果榨汁机。 0.99美元ea。 40.5盎司,什锦品种','Kiggins Frosty Flakes,Fruity Ringers或CrocO Crunch Cereal。 2.79美元ea。 28盎司','Kiggins烤面包机馅饼。 1.99美元ea。 22盎司,什锦品种','自然小径格兰诺拉麦片棒。 $ 1.79 ea。 8.4盎司,什锦品种','真正的水果杯。 10 / $ 10.00。 7盎司,什锦品种']

我不是.findall()的忠实粉丝,因为select()是bs4 documentation的首选方法。希望这有帮助

答案 1 :(得分:0)

为什么你要经历所有这些麻烦才能摆脱个别的追逐者?让regex一举为你完成所有肮脏的工作:

data = re.findall("<li tabindex.*?>\s+(.*?)\.?\s+.*?</li>", content)
# ['Facebook', 'Twitter', 'Pinterest', 'Instagram', 'Enter to Win']

这甚至可以在内容之后为空格和点提供一点灵活性。