使用 xpath 在 python 中搜索硬代码

Searching for hardcode in python with xpath

我想在一堆 python 模块中找到硬编码字符串,如电子邮件、路径或服务器名称(在本例中只是电子邮件)。 我尝试检查所有字典、列表和属性,如果它们包含 "mail" ,然后检查它们是否包含字符串。虽然我得到了所有硬编码的邮件,但我也得到了 mailList,它不是硬编码的,但在行中有 qoutes。

//TESTLIST_STAR_EXPR[contains(@tokenValue,"mail")]/..//STRING[contains(@tokenValue,"'")]

这是一个 xml 示例,它是从 python 模块解析而来的:

<FILE_INPUT tokenValue="import" tokenLine="7" tokenColumn="0">
  <STATEMENT tokenValue="import" tokenLine="7" tokenColumn="0">
    <STMT_LIST tokenValue="import" tokenLine="7" tokenColumn="0">
      <SIMPLE_STMT tokenValue="import" tokenLine="7" tokenColumn="0">
        <IMPORT_STMT tokenValue="import" tokenLine="7" tokenColumn="0">
          <IMPORT_NAME tokenValue="import" tokenLine="7" tokenColumn="0">
            <IMPORT tokenValue="import" tokenLine="7" tokenColumn="0"/>
            <DOTTED_AS_NAMES tokenValue="mails" tokenLine="7" tokenColumn="7">
              <DOTTED_AS_NAME tokenValue="mails" tokenLine="7" tokenColumn="7">
                <DOTTED_NAME tokenValue="mails" tokenLine="7" tokenColumn="7">
                  <NAME tokenValue="mails" tokenLine="7" tokenColumn="7">
                    <IDENTIFIER tokenValue="mails" tokenLine="7" tokenColumn="7"/>
                  </NAME>
                </DOTTED_NAME>
              </DOTTED_AS_NAME>
            </DOTTED_AS_NAMES>
          </IMPORT_NAME>
        </IMPORT_STMT>
      </SIMPLE_STMT>
    </STMT_LIST>
    <NEWLINE tokenValue="
" tokenLine="7" tokenColumn="12"/>
  </STATEMENT>
  <STATEMENT tokenValue="serverList" tokenLine="10" tokenColumn="0">
    <STMT_LIST tokenValue="serverList" tokenLine="10" tokenColumn="0">
      <SIMPLE_STMT tokenValue="serverList" tokenLine="10" tokenColumn="0">
        <EXPRESSION_STMT tokenValue="serverList" tokenLine="10" tokenColumn="0">
          <TESTLIST_STAR_EXPR tokenValue="serverList" tokenLine="10" tokenColumn="0">
            <TEST tokenValue="serverList" tokenLine="10" tokenColumn="0">
              <ATOM tokenValue="serverList" tokenLine="10" tokenColumn="0">
                <NAME tokenValue="serverList" tokenLine="10" tokenColumn="0">
                  <IDENTIFIER tokenValue="serverList" tokenLine="10" tokenColumn="0"/>
                </NAME>
              </ATOM>
            </TEST>
          </TESTLIST_STAR_EXPR>
          <ASSIGN tokenValue="=" tokenLine="10" tokenColumn="11"/>
          <TESTLIST_STAR_EXPR tokenValue="[" tokenLine="10" tokenColumn="13">
            <TEST tokenValue="[" tokenLine="10" tokenColumn="13">
              <ATOM tokenValue="[" tokenLine="10" tokenColumn="13">
                <LBRACKET tokenValue="[" tokenLine="10" tokenColumn="13"/>
                <TESTLIST_COMP tokenValue="'chserver.prod.amce'" tokenLine="10" tokenColumn="14">
                  <TEST tokenValue="'chserver.prod.amce'" tokenLine="10" tokenColumn="14">
                    <ATOM tokenValue="'chserver.prod.amce'" tokenLine="10" tokenColumn="14">
                      <STRING tokenValue="'chserver.prod.amce'" tokenLine="10" tokenColumn="14"/>
                    </ATOM>
                  </TEST>
                </TESTLIST_COMP>
                <RBRACKET tokenValue="]" tokenLine="10" tokenColumn="34"/>
              </ATOM>
            </TEST>
          </TESTLIST_STAR_EXPR>
        </EXPRESSION_STMT>
      </SIMPLE_STMT>
    </STMT_LIST>
    <NEWLINE tokenValue="
" tokenLine="10" tokenColumn="35"/>
  </STATEMENT>
  <STATEMENT tokenValue="mailDic" tokenLine="12" tokenColumn="0">
    <STMT_LIST tokenValue="mailDic" tokenLine="12" tokenColumn="0">
      <SIMPLE_STMT tokenValue="mailDic" tokenLine="12" tokenColumn="0">
        <EXPRESSION_STMT tokenValue="mailDic" tokenLine="12" tokenColumn="0">
          <TESTLIST_STAR_EXPR tokenValue="mailDic" tokenLine="12" tokenColumn="0">
            <TEST tokenValue="mailDic" tokenLine="12" tokenColumn="0">
              <ATOM tokenValue="mailDic" tokenLine="12" tokenColumn="0">
                <NAME tokenValue="mailDic" tokenLine="12" tokenColumn="0">
                  <IDENTIFIER tokenValue="mailDic" tokenLine="12" tokenColumn="0"/>
                </NAME>
              </ATOM>
            </TEST>
          </TESTLIST_STAR_EXPR>
          <ASSIGN tokenValue="=" tokenLine="12" tokenColumn="8"/>
          <TESTLIST_STAR_EXPR tokenValue="{" tokenLine="12" tokenColumn="10">
            <TEST tokenValue="{" tokenLine="12" tokenColumn="10">
              <ATOM tokenValue="{" tokenLine="12" tokenColumn="10">
                <LCURLYBRACE tokenValue="{" tokenLine="12" tokenColumn="10"/>
                <DICTORSETMAKER tokenValue="'John'" tokenLine="12" tokenColumn="12">
                  <TEST tokenValue="'John'" tokenLine="12" tokenColumn="12">
                    <ATOM tokenValue="'John'" tokenLine="12" tokenColumn="12">
                      <STRING tokenValue="'John'" tokenLine="12" tokenColumn="12"/>
                    </ATOM>
                  </TEST>
                  <COLON tokenValue=":" tokenLine="12" tokenColumn="19"/>
                  <TEST tokenValue="'john.e@hotmail.com'" tokenLine="12" tokenColumn="21">
                    <ATOM tokenValue="'john.e@hotmail.com'" tokenLine="12" tokenColumn="21">
                      <STRING tokenValue="'john.e@hotmail.com'" tokenLine="12" tokenColumn="21"/>
                    </ATOM>
                  </TEST>
                </DICTORSETMAKER>
                <RCURLYBRACE tokenValue="}" tokenLine="12" tokenColumn="41"/>
              </ATOM>
            </TEST>
          </TESTLIST_STAR_EXPR>
        </EXPRESSION_STMT>
      </SIMPLE_STMT>
    </STMT_LIST>
    <NEWLINE tokenValue="
" tokenLine="12" tokenColumn="42"/>
  </STATEMENT>
  <STATEMENT tokenValue="selection" tokenLine="14" tokenColumn="0">
    <STMT_LIST tokenValue="selection" tokenLine="14" tokenColumn="0">
      <SIMPLE_STMT tokenValue="selection" tokenLine="14" tokenColumn="0">
        <EXPRESSION_STMT tokenValue="selection" tokenLine="14" tokenColumn="0">
          <TESTLIST_STAR_EXPR tokenValue="selection" tokenLine="14" tokenColumn="0">
            <TEST tokenValue="selection" tokenLine="14" tokenColumn="0">
              <ATOM tokenValue="selection" tokenLine="14" tokenColumn="0">
                <NAME tokenValue="selection" tokenLine="14" tokenColumn="0">
                  <IDENTIFIER tokenValue="selection" tokenLine="14" tokenColumn="0"/>
                </NAME>
              </ATOM>
            </TEST>
          </TESTLIST_STAR_EXPR>
          <ASSIGN tokenValue="=" tokenLine="14" tokenColumn="10"/>
          <TESTLIST_STAR_EXPR tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12">
            <TEST tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12">
              <M_EXPR tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12">
                <ATOM tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12">
                  <STRING tokenValue="'mails=s%'" tokenLine="14" tokenColumn="12"/>
                </ATOM>
                <MOD tokenValue="%" tokenLine="14" tokenColumn="23"/>
                <POWER tokenValue="mails" tokenLine="14" tokenColumn="24">
                  <ATOM tokenValue="mails" tokenLine="14" tokenColumn="24">
                    <NAME tokenValue="mails" tokenLine="14" tokenColumn="24">
                      <IDENTIFIER tokenValue="mails" tokenLine="14" tokenColumn="24"/>
                    </NAME>
                  </ATOM>
                  <TRAILER tokenValue="." tokenLine="14" tokenColumn="29">
                    <DOT tokenValue="." tokenLine="14" tokenColumn="29"/>
                    <NAME tokenValue="Emails" tokenLine="14" tokenColumn="30">
                      <IDENTIFIER tokenValue="Emails" tokenLine="14" tokenColumn="30"/>
                    </NAME>
                  </TRAILER>
                </POWER>
              </M_EXPR>
            </TEST>
          </TESTLIST_STAR_EXPR>
        </EXPRESSION_STMT>
      </SIMPLE_STMT>
    </STMT_LIST>
  </STATEMENT>
  <EOF tokenValue="EOF" tokenLine="14" tokenColumn="36"/>
</FILE_INPUT>

问题是我想从 mailDic 字典中捕获条目,而不是从选择中捕获条目。

您写道:

Although I get all hardcoded mails, I also get mailList, which are not hardcoded, but have qoutes in the line.

给定您的输入数据,您当前的表达式 returns:

<STRING tokenColumn="12" tokenLine="12" tokenValue="'John'"/>
<STRING tokenColumn="21" tokenLine="12" tokenValue="'john.e@hotmail.com'"/>
<STRING tokenColumn="12" tokenLine="14" tokenValue="'mails=s%'"/>

单词 "mailList" 没有出现在你的数据中,但如果我假设它在当前显示 "mailDic" 的位置,那么你可以用这个修复它:

//TESTLIST_STAR_EXPR[
    contains(@tokenValue,"mail") 
    and not(@tokenValue = 'mailList')]
/..
//STRING[contains(@tokenValue,"'")]

如果您想过滤掉原始输入中的 s%,您可以使用以下命令:

//TESTLIST_STAR_EXPR[contains(@tokenValue,"mail")]
/..
//STRING[
    contains(@tokenValue,"'")
    and not contains(@tokenValue, 's%')]

否则,请使用与您的问题匹配的输入更新您的问题,因为它会导致 that link I gave you 中的 "Verifiable" 失败,也就是说,我看不出哪里出了问题,因为它是正确的; ).