【问题标题】:str() method adds whitespace charactersstr() 方法添加空白字符
【发布时间】:2017-06-18 22:51:30
【问题描述】:

如何防止 python 在调用 str() 时添加空白字符?我有一个使用 urllib.request 的屏幕抓取工具/网络爬虫。我在我的内容上调用 str() 。 这是我的代码。

req = urllib.request.Request(national_url, headers={'User-Agent' : "Magic Browser"})
con = urllib.request.urlopen( req )

#grab html
html = con.read()
my_str = str(html)

问题是我使用正则表达式来解析这个 html 中的一些模式,并且 str 添加了所有的空白字符,如 \n 和 \t。

我的问题是如何防止 str() 函数添加这些额外的字符文字。

编辑

我之前在我编写的 python 2.7 脚本中使用了 urllib2。我把它带到了一台新电脑上,但开始在这台电脑上使用 python 3.6。这些正则表达式不再起作用。将 con.read() 传递给此函数时出现错误。如上所示,我将 con.read() 包装在对 str() 的调用中,我注意到在 3.6 中,con.read() 函数添加了一大堆 \t 和 n的。我的问题是如何使我的表达式起作用,或禁止所有“字符文字”,也称为 '\t\n'(我承认我可能对这些字符使用了错误的术语)。

这在 Python 2.7 中有效。我切换到 python 3.6。

def parse_html_doc(str='', poke_id = 0):
    if len(str) > 0:

        poke = MyClass()
        poke.dex_num = re.search('\d+(?=<\/strong>)', str).group(0)
        poke.name = re.search('[A-Za-z]+(?=<\/h1>)', str).group(0)
        poke.hp = re.search('\d+', re.search('<th>HP<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0)
        poke.atk = re.search('\d+', re.search('<th>Attack<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0)
        poke.bdef = re.search('\d+', re.search('<th>Defense<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0)
        poke.spatk = re.search('\d+', re.search('<th>Sp\. Atk<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0)
        poke.spatk = re.search('\d+', re.search('<th>Sp\. Def<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0)
        poke.spd = re.search('\d+', re.search('<th>Speed<\/th>\s+<td class="num">\d+<\/td>', str).group(0)).group(0)
        poke.des = re.search('<p>.*<\/p>', str).group(0).replace('"', '""')
        poke.id = poke_id
        return poke

【问题讨论】:

  • 请定义“添加这些额外的字符文字”。您的意思是在您调用 str 之前它们不在那里,然后它们出现在之后吗?或者你的意思是你不喜欢它们的显示方式?你能给出使用示例输出吗?
  • "str 添加所有空格字符,如 \n 和 \t" - 不,它没有。 “问题是我使用正则表达式来解析这个 html 的某些模式” - 是的,这当然是一个问题。不要使用正则表达式来解析 HTML。使用真正的解析器,例如 BeautifulSoup。
  • str() 不会添加这些字符 - 它们一直存在 - 这就是我们使用 lxmlBeautifulSoup 等解析器的原因。
  • 您在浏览器中看不到换行符,因为 html 内容类型不呈现换行符,但这并不意味着源 html 没有换行符。您只需要在正则表达式上使用 re.DOTALL 标志
  • “如何防止 python 在调用 str() 时添加空白字符” - str 肯定不会这样做。

标签: python regex string web-crawler urllib


【解决方案1】:

str() 不会创建这些字符,它们已经存在。

如果你想删除字符串开头和结尾的\nwhitespace,那么你可以使用

s = '\n     bla 123\n 1235\n ...\n'
result = s.strip()
print(result)

> 'bla 123\n 1235\n ...'

【讨论】:

    【解决方案2】:

    看起来你想这样做:

    eq = urllib.request.Request(national_url, headers={'User-Agent' : "Magic Browser"})
    con = urllib.request.urlopen( req )
    
    #grab html
    html = con.read()
    my_str = str(html.replace("\n", "")
    my_str = my_str.replace("\t", "")
    

    这应该会删除字符串中的所有空白字符。

    【讨论】:

    • 这对我不起作用,因为字符串模块中不存在 maketrans。
    • 好像我错了。 string.maketrans 已弃用。我会更新答案。
    • 仍然出现错误。 my_str = str(html.translate(str.maketrans("\n\t\r", ""))) ValueError: 前两个 maketrans 参数的长度必须相等
    • 嗯。我没有经常使用maketrans,因此我不知道这一点。我会找到另一种方法然后更新答案。
    • 替换似乎也没有奏效。这是我写给你的,所有的 \t 和 \n 都还在。 html = con.read() my_str = str(html).replace("\n", "") my_str = my_str.replace("\t", "")
    猜你喜欢
    • 1970-01-01
    • 2018-12-17
    • 2011-09-30
    • 2016-07-19
    • 1970-01-01
    • 2015-04-21
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    相关资源
    最近更新 更多