【问题标题】:How to search for a substrings value inside of a string?如何在字符串中搜索子字符串值?
【发布时间】:2014-07-03 05:39:54
【问题描述】:

我正在尝试在字符串中查找属性的值。在<img src="invalidURL.com"> 中,如果属性/子字符串是src,我想收到invalidURL.com

在 Violent Python 中,它使用imgSrc = imgTag['src'] 行,这不会产生编译器错误,并且脚本运行良好。 (完整的脚本可以在this Github repo. 找到)但是,当我尝试编写自己的脚本时,它给出了编译器错误。

htmlImgTags = ['<img src="/images/icons/product/chrome-48.png"/>', '<img src="asdasd">']
for tag in htmlImgTags:
    print tag
    tagSrc = tag['src'] 
    print tagSrc

该错误抱怨使用字符串作为索引而不是 int。

<img src="/images/icons/product/chrome-48.png"/>
Traceback (most recent call last):
  File "looking in an array.py", line 4, in <module>
    tagSrc = tag['src'] 
TypeError: string indices must be integers, not str

我的代码到底出了什么问题,但书中没有?

【问题讨论】:

    标签: python arrays string


    【解决方案1】:

    您链接到的代码似乎正在使用名为 Beautiful Soup 的库来解析 HTML。该循环是在 Beautiful Soup 创建的标签对象列表上,而不是实际标签文本的列表。

    这是一个使用Beautiful Soup v3的示例:

    from BeautifulSoup import BeautifulSoup
    
    html_doc = """
    <img src="/images/icons/product/chrome-48.png"/>
    <img src="/images/icons/product/chrome-49.png"/>
    """
    
    soup = BeautifulSoup(html_doc)
    html_img_tags = soup.findAll("img")
    
    for tag in html_img_tags:
      print tag['src']
    

    输出是:

    /images/icons/product/chrome-48.png
    /images/icons/product/chrome-49.png
    

    注意tag 只是一个字符串,它是一个 BeautifulSoup 标签对象:

    >>> type(html_img_tags[0])
    <class 'BeautifulSoup.Tag'>
    

    如果您打印它,它将显示为格式良好的标签:

    >>> print html_img_tags[0]
    <img src="/images/icons/product/chrome-48.png" />
    

    但这只是因为 BeautifulSoup 确保对象将自身转换为该字符串以便于检查。


    注意:如果你的机器上碰巧有 BS4,那么导入行应该是:

    from bs4 import BeautifulSoup
    

    ...findAll() 函数现在是 find_all()

    【讨论】:

    • 但在这种情况下,不是标记包含&lt;img src="/images/icons/product/chrome-48.png"/&gt; 的字符串,还是我对soup.findAll 的作用感到非常困惑?
    • 不,不是。它是由 BeautifulSoup 创建的代表该标签的对象。很方便,当您打印它时,它看起来像这样:&lt;img src="/images/icons/product/chrome-48.png" /&gt; ...但这只是因为 BeautifulSoup 确保对象将自身转换为该字符串以便于检查。我对此添加了解释,如果清楚,请告诉我:)
    • 谢谢! +1 为了编写一个易于理解的答案、更新它、解释它打印的整体使其看起来像一个字符串等等。我需要打开一个元帖子来弄清楚如何对其他答案进行投票。 :P
    【解决方案2】:

    您链接到的源代码正在使用一个名为 BeautifulSoup 的库来解析 HTML。您似乎是在尝试手动执行此操作,我认为是出于教育目的。

    您有几个选择。

    • 一种是使用 html 解析引擎,就像 Violent Python 使用的那样。这是推荐的方法。

    • 还有一种是使用正则表达式,不建议解析XML。

    • 第三种方法(仅当您的输入已经采用您给定的形式时才有效)只是计算 URL 的位置并使用这些位置索引到字符串中。

    【讨论】:

      【解决方案3】:

      这样就不会出错了:

      for tag in htmlImgTags:
          if tag.startswith('<img src'):
             tag = tag.split('"')[1]
             print tag
      

      【讨论】:

      • 我不想弄清楚它是否包含src。我试图弄清楚src 的值等于多少。 (在&lt;img src="freddy"&gt; 的情况下,src 的值是freddy)我也喜欢搜索img。 (在我的情况下这不是想要的,但这是个好主意。)
      • @Cammy_the_block:检查一下
      • 应该有链接吗?
      • 我添加了一行。标记现在将包含作为字符串的链接
      【解决方案4】:

      试试这个:

      import re
      tag = '<img src="/images/icons/product/chrome-48.png"/>'
      src = re.findall('src=(\".*?\")', tag)
      print src # prints ['"/images/icons/product/chrome-48.png"']
      

      【讨论】:

      • 我正在尝试获取/images/icons/product/chrome-48 .png,无论字符串是否包含src
      • @Cammy_the_block 我误解了你的问题...查看新版本 ;)
      猜你喜欢
      • 1970-01-01
      • 2019-10-06
      • 2022-01-23
      • 2014-04-27
      • 2021-04-25
      • 2011-07-04
      • 2023-04-03
      相关资源
      最近更新 更多